Bug #105202 ha_innopart::store_lock() traverse all partitions starting from index 1 not 0
Submitted: 13 Oct 2021 10:02 Modified: 13 Oct 2021 10:39
Reporter: Hope Lee (OCA) Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: Partitions Severity:S3 (Non-critical)
Version:8.0.26, 5.7.35 OS:Any
Assigned to: CPU Architecture:Any

[13 Oct 2021 10:02] Hope Lee
Description:
The function ha_innopart::store_lock() intend to traverse all partitions to call row_quiesce_set_state() for each partition's dict_table_t. But it starts from array index one instead of zero. How about the first partition with index 0 in array m_part_share? I think this is a typo error to leave out the first partition.

How to repeat:
Look into the function ha_innopart::store_lock() code in storage/innobase/handler/ha_innopart.cc .

THR_LOCK_DATA **ha_innopart::store_lock(THD *thd, THR_LOCK_DATA **to,
                                        thr_lock_type lock_type) {
  trx_t *trx = m_prebuilt->trx;
  const uint sql_command = thd_sql_command(thd);

  ha_innobase::store_lock(thd, to, lock_type);

  if (sql_command == SQLCOM_FLUSH && lock_type == TL_READ_NO_INSERT) {
    for (uint i = 1; i < m_tot_parts; i++) {
      dict_table_t *table = m_part_share->get_table_part(i);

      dberr_t err = row_quiesce_set_state(table, QUIESCE_START, trx);
      ut_a(err == DB_SUCCESS || err == DB_UNSUPPORTED);
    }
  }

  return to;
}

Suggested fix:
diff --git a/storage/innobase/handler/ha_innopart.cc b/storage/innobase/handler/ha_innopart.cc
index e6c2fe0eebe..6eda8f685fe 100644
--- a/storage/innobase/handler/ha_innopart.cc
+++ b/storage/innobase/handler/ha_innopart.cc
@@ -3985,7 +3985,7 @@ THR_LOCK_DATA **ha_innopart::store_lock(THD *thd, THR_LOCK_DATA **to,
   ha_innobase::store_lock(thd, to, lock_type);

   if (sql_command == SQLCOM_FLUSH && lock_type == TL_READ_NO_INSERT) {
-    for (uint i = 1; i < m_tot_parts; i++) {
+    for (uint i = 0; i < m_tot_parts; i++) {
       dict_table_t *table = m_part_share->get_table_part(i);

       dberr_t err = row_quiesce_set_state(table, QUIESCE_START, trx);
[13 Oct 2021 10:39] MySQL Verification Team
Hello Lee,

Thank you for the report and feedback.

regards,
Umesh