From 27fcdb161c8bb1fd21d2706ba17a3326f8221b9c Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 11 Jun 2019 17:51:09 +0200 Subject: MDEV-16249 CHECKSUM TABLE for a spider table is not parallel and saves all data in memory in the spider head by default (#1328) followup for be5c432a42e ha_partition::calculate_checksum() has to invoke calculate_checksum() for partitions unconditionally, not under (HA_HAS_OLD_CHECKSUM | HA_HAS_NEW_CHECKSUM). Because the server uses ::info() to ask for a live checksum, while calculate_checksum() must, precisely, calculate it the slow way, also for tables that don't have the live checksum at all. Also, fix the compilation on Windows (ha_checksum/ulonglong type mix). --- sql/ha_partition.cc | 26 ++++++++++++-------------- sql/handler.cc | 4 ++-- storage/spider/ha_spider.h | 2 +- storage/spider/spd_db_mysql.cc | 4 ++-- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index e47da94ab20..8a0b9822493 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -10645,22 +10645,20 @@ int ha_partition::calculate_checksum() } } m_pre_calling= FALSE; - if ((table_flags() & (HA_HAS_OLD_CHECKSUM | HA_HAS_NEW_CHECKSUM))) + + handler **file= m_file; + do { - handler **file= m_file; - do + if ((error= (*file)->calculate_checksum())) { - if ((error= (*file)->calculate_checksum())) - { - DBUG_RETURN(error); - } - if (!(*file)->stats.checksum_null) - { - stats.checksum+= (*file)->stats.checksum; - stats.checksum_null= FALSE; - } - } while (*(++file)); - } + DBUG_RETURN(error); + } + if (!(*file)->stats.checksum_null) + { + stats.checksum+= (*file)->stats.checksum; + stats.checksum_null= FALSE; + } + } while (*(++file)); DBUG_RETURN(0); } diff --git a/sql/handler.cc b/sql/handler.cc index 908d49d861a..dfb5c69e675 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -5054,7 +5054,7 @@ int handler::calculate_checksum() return HA_ERR_ABORTED_BY_USER; ha_checksum row_crc= 0; - error= table->file->ha_rnd_next(table->record[0]); + error= ha_rnd_next(table->record[0]); if (error) break; @@ -5108,7 +5108,7 @@ int handler::calculate_checksum() stats.checksum+= row_crc; } - table->file->ha_rnd_end(); + ha_rnd_end(); return error == HA_ERR_END_OF_FILE ? 0 : error; } diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h index 6ac71254b12..6f5359007f1 100644 --- a/storage/spider/ha_spider.h +++ b/storage/spider/ha_spider.h @@ -245,7 +245,7 @@ public: #endif ha_rows table_rows; #ifdef HA_HAS_CHECKSUM_EXTENDED - ulonglong checksum_val; + ha_checksum checksum_val; bool checksum_null; uint action_flags; #endif diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index 313c6d0495c..393263e152d 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -1142,9 +1142,9 @@ int spider_db_mbase_result::fetch_simple_action( if (mysql_row[position]) { spider->checksum_val = - (ulonglong) my_strtoll10(mysql_row[position], (char**) NULL, + (ha_checksum) my_strtoll10(mysql_row[position], (char**) NULL, &error_num); - DBUG_PRINT("info", ("spider checksum=%llu", spider->checksum_val)); + DBUG_PRINT("info", ("spider checksum=%llu", (ulonglong)spider->checksum_val)); spider->checksum_null = FALSE; } else { spider->checksum_null = TRUE; -- cgit v1.2.1