summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2019-06-11 17:51:09 +0200
committerSergei Golubchik <serg@mariadb.org>2019-06-11 18:42:45 +0200
commit27fcdb161c8bb1fd21d2706ba17a3326f8221b9c (patch)
tree5003d227d2e178d156867ea1b47ae1cc56748893
parentbb70d41932a23669dedf108d1af8581a3e7813d8 (diff)
downloadmariadb-git-27fcdb161c8bb1fd21d2706ba17a3326f8221b9c.tar.gz
MDEV-16249 CHECKSUM TABLE for a spider table is not parallel and saves all data in memory in the spider head by default (#1328)bb-10.4-MDEV-16249
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).
-rw-r--r--sql/ha_partition.cc26
-rw-r--r--sql/handler.cc4
-rw-r--r--storage/spider/ha_spider.h2
-rw-r--r--storage/spider/spd_db_mysql.cc4
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;