in core/lib/payload/copy.py [0:0]
def sync_table_partitions(self) -> None:
"""
If table partitions have changed on the original table, apply the same
changes before swapping table, or we will likely break replication
if using row-based.
"""
log.info("== Stage 5.1: Check table partitions are up-to-date ==")
# we're using partitions in the ddl file, skip syncing anything
if not self.rm_partition:
return
# not a partitioned table, nothing to do
if not self.partitions:
return
# only apply this logic to RANGE partitioning, as other types
# are usually static
partition_method = self.get_partition_method(
self._current_db, self.new_table_name
)
if partition_method != "RANGE":
return
try:
new_tbl_parts = self.list_partition_names(self.new_table_name)
orig_tbl_parts = self.list_partition_names(self.table_name)
parts_to_drop = set(new_tbl_parts) - set(orig_tbl_parts)
parts_to_add = set(orig_tbl_parts) - set(new_tbl_parts)
# information schema literally has the string None for
# non-partitioned tables. Previous checks *should* prevent us
# from hitting this.
if "None" in parts_to_add or "None" in parts_to_drop:
log.warning(
"MySQL claims either %s or %s are not partitioned",
self.new_table_name,
self.table_name,
)
return
if parts_to_drop:
log.info(
"Partitions missing from source table "
"to drop from new table %s: %s",
self.new_table_name,
", ".join(parts_to_drop),
)
if parts_to_add:
log.info(
"Partitions in source table to add to new table %s: %s",
self.new_table_name,
", ".join(parts_to_add),
)
self.apply_partition_differences(parts_to_drop, parts_to_add)
except Exception:
log.exception(
"Unable to sync new table %s with orig table %s partitions",
self.new_table_name,
self.table_name,
)