Page MenuHomePhabricator

🏖️ Southward Datacenter Switchover (Sept. 2026)
Open, MediumPublic

Description

This is an umbrella task for the upcoming Sept 2026 Southward (eqiad to codfw) DC Switchover.

Switchovers take place at predictable dates; the work week of the Solar Equinox.

Important Dates

If you have any related work, please file your tasks below.

Related Objects

StatusSubtypeAssignedTask
OpenSLyngshede-WMF
ResolvedTrizek-WMF
DeclinedSLyngshede-WMF
DeclinedSLyngshede-WMF
DeclinedSLyngshede-WMF
ResolvedFCeratto-WMF
ResolvedFCeratto-WMF
OpenFCeratto-WMF
OpenNone
DeclinedSLyngshede-WMF
ResolvedSLyngshede-WMF
ResolvedSLyngshede-WMF
ResolvedCWilliams-WMF
OpenNone
OpenNone
ResolvedNone
OpenEjegg
ResolvedMarostegui
DuplicateNone
Openjasmine_

Event Timeline

SLyngshede-WMF renamed this task from 🚀 Southward Datacenter Switchover (Sept. 2026) to 🏖️ Southward Datacenter Switchover (Sept. 2026).Jul 28 2026, 12:12 PM

Change #1319815 had a related patch set uploaded (by Slyngshede; author: Slyngshede):

[operations/dns@master] wmnet: update CNAME records for DB masters to codfw

https://gerrit.wikimedia.org/r/1319815

Change #1319816 had a related patch set uploaded (by Slyngshede; author: Slyngshede):

[operations/dns@master] geo-maps: update map default to list codfw first

https://gerrit.wikimedia.org/r/1319816

Change #1319825 had a related patch set uploaded (by Slyngshede; author: Slyngshede):

[operations/dns@master] wmnet: update deployment CNAME record to deploy2003

https://gerrit.wikimedia.org/r/1319825

Change #1319826 had a related patch set uploaded (by Slyngshede; author: Slyngshede):

[operations/puppet@production] hieradata: update deployment_server to deploy2002

https://gerrit.wikimedia.org/r/1319826

Change #1319818 had a related patch set uploaded (by Slyngshede; author: Slyngshede):

[operations/mediawiki-config@master] debug.json: order codfw (primary) DC backends first

https://gerrit.wikimedia.org/r/1319818

Dry-run test - To be fixed:

00-reduce-ttl:

DRY-RUN: No task specified, skipping task update with comment: slyngshede@cumin1003 - Cookbook cookbooks.sre.switchdc.mediawiki.00-reduce-ttl for datacenter switchover from eqiad to codfw - finished with status: **FAILURE** elapsed time: 0:00:00.014131
DRY-RUN: Exception raised while executing cookbook sre.switchdc.mediawiki.00-reduce-ttl:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/spicerack/dnsdisc.py", line 229, in resolve
    answer = dns_resolver.query(record_name)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/dns/resolver.py", line 1262, in query
    return self.resolve(
           ^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/dns/resolver.py", line 1190, in resolve
    (request, answer) = resolution.next_request()
                        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/dns/resolver.py", line 691, in next_request
    raise NXDOMAIN(qnames=self.qnames_to_try, responses=self.nxdomain_responses)
dns.resolver.NXDOMAIN: The DNS query name does not exist: mw-parsoid.discovery.wmnet.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/spicerack/_menu.py", line 265, in _run
    raw_ret = runner.run()
              ^^^^^^^^^^^^
  File "/srv/deployment/spicerack/cookbooks/sre/switchdc/mediawiki/__init__.py", line 145, in run
    ret = self.action()
          ^^^^^^^^^^^^^
  File "/srv/deployment/spicerack/cookbooks/sre/switchdc/mediawiki/00-reduce-ttl.py", line 25, in action
    old_ttl_sec = max(record.ttl for record in discovery.resolve())
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/srv/deployment/spicerack/cookbooks/sre/switchdc/mediawiki/00-reduce-ttl.py", line 25, in <genexpr>
    old_ttl_sec = max(record.ttl for record in discovery.resolve())
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/spicerack/dnsdisc.py", line 231, in resolve
    raise DiscoveryError(f"Unable to resolve {record_name} from {nameserver}") from e
spicerack.dnsdisc.DiscoveryError: Unable to resolve mw-parsoid.discovery.wmnet from dns1004.wikimedia.org

01-stop-maintenance

DRY-RUN: No task specified, skipping task update with comment: slyngshede@cumin1003 - Cookbook cookbooks.sre.switchdc.mediawiki.01-stop-maintenance for datacenter switchover from eqiad to codfw - finished with status: **FAILURE** elapsed time: 0:00:00.580888
DRY-RUN: Exception raised while executing cookbook sre.switchdc.mediawiki.01-stop-maintenance:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/spicerack/_menu.py", line 265, in _run
    raw_ret = runner.run()
              ^^^^^^^^^^^^
  File "/srv/deployment/spicerack/cookbooks/sre/switchdc/mediawiki/__init__.py", line 145, in run
    ret = self.action()
          ^^^^^^^^^^^^^
  File "/srv/deployment/spicerack/cookbooks/sre/switchdc/mediawiki/01-stop-maintenance.py", line 55, in action
    _wait_for_jobs_to_stop(batch_api, namespace=namespace, dry_run=self.spicerack.dry_run)
  File "/usr/lib/python3/dist-packages/wmflib/decorators.py", line 244, in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/srv/deployment/spicerack/cookbooks/sre/switchdc/mediawiki/01-stop-maintenance.py", line 71, in _wait_for_jobs_to_stop
    raise SpicerackCheckError(f'{len(still_running)} {namespace} {jobs} still running: {names}')
spicerack.exceptions.SpicerackCheckError: 3 mw-script jobs still running: mw-script.eqiad.1w6c7bq0, mw-script.eqiad.l9oy281u, mw-script.eqiad.m2lj8b5z

04-switch-mediawiki

DRY-RUN: No task specified, skipping task update with comment: slyngshede@cumin1003 - Cookbook cookbooks.sre.switchdc.mediawiki.04-switch-mediawiki for datacenter switchover from eqiad to codfw - finished with status: **FAILURE** elapsed time: 0:00:10.401518
DRY-RUN: Exception raised while executing cookbook sre.switchdc.mediawiki.04-switch-mediawiki:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/spicerack/dnsdisc.py", line 105, in resolve_address
    return next(iter(self._resolvers.values())).query(name)[0].address
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/dns/resolver.py", line 1262, in query
    return self.resolve(
           ^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/dns/resolver.py", line 1190, in resolve
    (request, answer) = resolution.next_request()
                        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/dns/resolver.py", line 691, in next_request
    raise NXDOMAIN(qnames=self.qnames_to_try, responses=self.nxdomain_responses)
dns.resolver.NXDOMAIN: The DNS query name does not exist: mw-parsoid.svc.codfw.wmnet.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/spicerack/_menu.py", line 265, in _run
    raw_ret = runner.run()
              ^^^^^^^^^^^^
  File "/srv/deployment/spicerack/cookbooks/sre/switchdc/mediawiki/__init__.py", line 145, in run
    ret = self.action()
          ^^^^^^^^^^^^^
  File "/srv/deployment/spicerack/cookbooks/sre/switchdc/mediawiki/04-switch-mediawiki.py", line 39, in action
    dnsdisc_records.check_record(record, '{name}.svc.{dc_to}.wmnet'.format(name=record, dc_to=self.dc_to))
  File "/usr/lib/python3/dist-packages/wmflib/decorators.py", line 244, in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/spicerack/dnsdisc.py", line 180, in check_record
    expected_address = self.resolve_address(expected_name)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/spicerack/dnsdisc.py", line 107, in resolve_address
    raise DiscoveryError(f"Unable to resolve {name}") from e
spicerack.dnsdisc.DiscoveryError: Unable to resolve mw-parsoid.svc.codfw.wmnet

09-restore-ttl

DRY-RUN: No task specified, skipping task update with comment: slyngshede@cumin1003 - Cookbook cookbooks.sre.switchdc.mediawiki.09-restore-ttl for datacenter switchover from eqiad to codfw - finished with status: **FAILURE** elapsed time: 0:00:00.081563
DRY-RUN: Exception raised while executing cookbook sre.switchdc.mediawiki.09-restore-ttl:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/spicerack/dnsdisc.py", line 229, in resolve
    answer = dns_resolver.query(record_name)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/dns/resolver.py", line 1262, in query
    return self.resolve(
           ^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/dns/resolver.py", line 1190, in resolve
    (request, answer) = resolution.next_request()
                        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/dns/resolver.py", line 691, in next_request
    raise NXDOMAIN(qnames=self.qnames_to_try, responses=self.nxdomain_responses)
dns.resolver.NXDOMAIN: The DNS query name does not exist: mw-parsoid.discovery.wmnet.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/spicerack/_menu.py", line 265, in _run
    raw_ret = runner.run()
              ^^^^^^^^^^^^
  File "/srv/deployment/spicerack/cookbooks/sre/switchdc/mediawiki/__init__.py", line 145, in run
    ret = self.action()
          ^^^^^^^^^^^^^
  File "/srv/deployment/spicerack/cookbooks/sre/switchdc/mediawiki/09-restore-ttl.py", line 19, in action
    dnsdisc_records.update_ttl(300)
  File "/usr/lib/python3/dist-packages/spicerack/dnsdisc.py", line 123, in update_ttl
    self.check_ttl(ttl)
  File "/usr/lib/python3/dist-packages/wmflib/decorators.py", line 244, in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/spicerack/dnsdisc.py", line 146, in check_ttl
    for record in self.resolve():
  File "/usr/lib/python3/dist-packages/spicerack/dnsdisc.py", line 231, in resolve
    raise DiscoveryError(f"Unable to resolve {record_name} from {nameserver}") from e
spicerack.dnsdisc.DiscoveryError: Unable to resolve mw-parsoid.discovery.wmnet from dns1004.wikimedia.org
DRY-RUN: Releasing lock for key sre.switchdc.mediawiki.09-restore-ttl with ID 685e3ecb-7cde-4273-9c8b-b1668bdfac20

Overall result

#--- Switch Datacenter for MediaWiki args=['eqiad', 'codfw'] ---#
[PASS] 00-downtime-db-readonly-checks: Downtime read-only checks on MariaDB primaries changed in Phase 3 so they don't page.
[PASS] 00-lock-scap: Lock scap.
[FAIL] 00-optional-warmup-caches: Warmup MediaWiki caches.
[FAIL] 00-reduce-ttl: Reduce TTL for various DNS Discovery entries.
[FAIL] 01-stop-maintenance: Stop MediaWiki maintenance and periodic jobs.
[PASS] 02-set-readonly: Set MediaWiki in read-only mode.
[PASS] 03-set-db-readonly: Set the old-site core DB primaries in read-only mode and check replication.
[FAIL] 04-switch-mediawiki: Switch MediaWiki active datacenter.
[PASS] 06-set-db-readwrite: Set the new-site core DB primaries in read-write mode.
[PASS] 07-set-readwrite: Set MediaWiki in read-write mode.
[PASS] 08-restart-mw-jobrunner: Restart pods in mw-jobrunner on kubernetes and envoy on jobrunner hosts in DC_FROM.
[PASS] 08-start-maintenance: Start MediaWiki maintenance jobs.
[FAIL] 09-restore-ttl: Restore TTL for various DNS Discovery entries.
[PASS] 09-run-puppet-on-db-masters: Run Puppet on all core DB primaries and remove read-only check downtimes.
[PASS] 09-unlock-scap: Unlock scap.
q - Quit
h - Help

Change #1331446 had a related patch set uploaded (by Slyngshede; author: Slyngshede):

[operations/cookbooks@master] switchdc: remove parsoid

https://gerrit.wikimedia.org/r/1331446

Errors from dry-run is solely related to parsoid, with the expection of 04-switch-mediawiki which simply doesn't handle dry-run and simply notices that the jobs remain running and therefor raise an exception.

Change #1331446 merged by jenkins-bot:

[operations/cookbooks@master] switchdc: remove parsoid

https://gerrit.wikimedia.org/r/1331446

Removing parsoid fixed the cookbook issues:

#--- Switch Datacenter for MediaWiki args=['eqiad', 'codfw'] ---#
[PASS] 00-downtime-db-readonly-checks: Downtime read-only checks on MariaDB primaries changed in Phase 3 so they don't page.
[PASS] 00-lock-scap: Lock scap.
[PASS] 00-optional-warmup-caches: Warmup MediaWiki caches.
[PASS] 00-reduce-ttl: Reduce TTL for various DNS Discovery entries.
[FAIL] 01-stop-maintenance: Stop MediaWiki maintenance and periodic jobs.
[PASS] 02-set-readonly: Set MediaWiki in read-only mode.
[PASS] 03-set-db-readonly: Set the old-site core DB primaries in read-only mode and check replication.
[PASS] 04-switch-mediawiki: Switch MediaWiki active datacenter.
[PASS] 06-set-db-readwrite: Set the new-site core DB primaries in read-write mode.
[PASS] 07-set-readwrite: Set MediaWiki in read-write mode.
[PASS] 08-restart-mw-jobrunner: Restart pods in mw-jobrunner on kubernetes and envoy on jobrunner hosts in DC_FROM.
[PASS] 08-start-maintenance: Start MediaWiki maintenance jobs.
[PASS] 09-restore-ttl: Restore TTL for various DNS Discovery entries.
[PASS] 09-run-puppet-on-db-masters: Run Puppet on all core DB primaries and remove read-only check downtimes.
[PASS] 09-unlock-scap: Unlock scap.

Again 01-stop-maintenance checks if the jobs are running, even in DRY-RUN, causing the check to fail.

Change #1332725 had a related patch set uploaded (by Slyngshede; author: Slyngshede):

[operations/deployment-charts@master] mw-web: upsize for single-DC serving

https://gerrit.wikimedia.org/r/1332725

Change #1333603 had a related patch set uploaded (by Slyngshede; author: Slyngshede):

[operations/deployment-charts@master] mw-api-ext: upsize for single-DC serving

https://gerrit.wikimedia.org/r/1333603

Change #1333603 merged by jenkins-bot:

[operations/deployment-charts@master] mw-api-ext: upsize for single-DC serving

https://gerrit.wikimedia.org/r/1333603

Change #1332725 merged by jenkins-bot:

[operations/deployment-charts@master] mw-web: upsize for single-DC serving

https://gerrit.wikimedia.org/r/1332725