in core/lib/payload/copy.py [0:0]
def swap_tables(self):
"""
Flip the table name while holding the write lock. All operations
during this stage will be executed inside a single transaction.
"""
if self.stop_before_swap:
return True
log.info("== Stage 6: Swap table ==")
self.stop_slave_sql()
self.execute_sql(sql.set_session_variable("autocommit"), (0,))
self.start_transaction()
stage_start_time = time.time()
self.lock_tables((self.new_table_name, self.table_name, self.delta_table_name))
log.info("Final round of replay before swap table")
self.replay_changes(single_trx=True, holding_locks=True)
# We will not run delta checksum here, because there will be an error
# like this, if we run a nested query using `NOT EXISTS`:
# SQL execution error: [1100] Table 't' was not locked with LOCK TABLES
self.execute_sql(sql.rename_table(self.table_name, self.renamed_table_name))
self.table_swapped = True
self.add_drop_table_entry(self.renamed_table_name)
self.execute_sql(sql.rename_table(self.new_table_name, self.table_name))
log.info("Table has successfully swapped, new schema takes effect now")
self._cleanup_payload.remove_drop_table_entry(
self._current_db, self.new_table_name
)
self.commit()
self.unlock_tables()
self.stats["time_in_lock"] = self.stats.setdefault("time_in_lock", 0) + (
time.time() - stage_start_time
)
self.execute_sql(sql.set_session_variable("autocommit"), (1,))
self.start_slave_sql()