in core/lib/payload/copy.py [0:0]
def pre_osc_check(self):
"""
Pre-OSC sanity check.
Make sure all temporary table which will be used during data copy
stage doesn't exist before we actually creating one.
Also doing some index sanity check.
"""
# Make sure temporary table we will use during copy doesn't exist
tables_to_check = (
self.new_table_name,
self.delta_table_name,
self.renamed_table_name,
)
for table_name in tables_to_check:
if self.table_exists(table_name):
raise OSCError(
"TABLE_ALREADY_EXIST", {"db": self._current_db, "table": table_name}
)
# Make sure new table schema has primary key
if not all(
(self._new_table.primary_key, self._new_table.primary_key.column_list)
):
raise OSCError(
"NO_PK_EXIST", {"db": self._current_db, "table": self.table_name}
)
self.decide_pk_for_filter()
# Check if we can have indexes in new table to efficiently look up
# current old pk combinations
if not self.validate_post_alter_pk():
self.table_size = self.get_table_size(self.table_name)
if self.skip_pk_coverage_check:
log.warning(
"Indexes on new table cannot cover current PK of "
"the old schema, which will make binary logs replay "
"in an inefficient way."
)
elif self.table_size < self.pk_coverage_size_threshold:
log.warning(
"No index on new table can cover old pk. Since this is "
"a small table: {}, we fallback to a full table dump".format(
self.table_size
)
)
# All columns will be chosen if we are dumping table without
# chunking, this means all columns will be used as a part of
# the WHERE condition when replaying
self.is_full_table_dump = True
self._pk_for_filter = [col.name for col in self._old_table.column_list]
self._pk_for_filter_def = self._old_table.column_list.copy()
elif self.is_full_table_dump:
log.warning(
"Skipping coverage index test, since we are doing "
"full table dump"
)
else:
old_pk_names = ", ".join(
"`{}`".format(col.name)
for col in self._old_table.primary_key.column_list
)
raise OSCError("NO_INDEX_COVERAGE", {"pk_names": old_pk_names})
log.info(
"PK filter for replaying changes later: {}".format(self._pk_for_filter)
)
self.foreign_key_check()
self.trigger_check()
self.init_range_variables()
self.get_table_chunk_size()
self.make_chunk_size_odd()
self.check_disk_size()
self.ts_bootstrap_check()
self.drop_columns_check()