HomePhabricator

Apply storage patches patch-by-patch, not database-by-database

Description

Apply storage patches patch-by-patch, not database-by-database

Summary:
Ref T11044. Sometimes we have a sequence of patches like this:

  • 01.newtable.sql: Adds a new table to Files.
  • 02.movedata.php: Moves some data that used to live in Tokens to the new table.

This is fairly rare, but not unheard of. More commonly, we can have this sequence:

  • 03.newtable.sql: Add a new column to Phame.
  • 04.setvalue.php: Copy data into that new column.

In both cases, when applying database-by-database, we can get into trouble.

  • In the first case, if Files is on a different master, we'll try to move data into a new table before creating the table.
  • In the second case, if Phame is on a different master, the PHP patch will connect to it before we add the new column.

In either case, we try to interact with tables or columns which don't exist yet.

Instead, apply each patch in order, to all databases which need it. So we'll apply 01.newtable.sql EVERYWHERE first, then move on.

In the case of PHP patches, we also now only apply them once, since they never make schema changes. It should normally be OK to apply them more than once safely, but this is a little faster and a little safer if we ever make a mistake.

Test Plan:

  • Ran bin/storage upgrade on single-host and clustered setups.
  • Initialized new storage on single-host and clustered setups.
  • Upgraded again after initialization.
  • Ran with --apply.
  • Ran with --dry-run.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T11044

Differential Revision: https://secure.phabricator.com/D16912