Commit 15e8649e authored by Zardosht Kasheff's avatar Zardosht Kasheff Committed by Yoni Fogel

addresses #1001

reduce number of key_range64 calls

git-svn-id: file:///svn/mysql/tokudb-engine/src@4969 c7de825b-a66e-492c-adef-691d508d4ae1
parent f5f67151
...@@ -699,7 +699,7 @@ ha_tokudb::ha_tokudb(handlerton * hton, TABLE_SHARE * table_arg) ...@@ -699,7 +699,7 @@ ha_tokudb::ha_tokudb(handlerton * hton, TABLE_SHARE * table_arg)
// flags defined in sql\handler.h // flags defined in sql\handler.h
int_table_flags(HA_REC_NOT_IN_SEQ | HA_FAST_KEY_READ | HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS | HA_PRIMARY_KEY_IN_READ_INDEX | int_table_flags(HA_REC_NOT_IN_SEQ | HA_FAST_KEY_READ | HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS | HA_PRIMARY_KEY_IN_READ_INDEX |
HA_FILE_BASED | HA_CAN_GEOMETRY | HA_AUTO_PART_KEY | HA_TABLE_SCAN_ON_INDEX), HA_FILE_BASED | HA_CAN_GEOMETRY | HA_AUTO_PART_KEY | HA_TABLE_SCAN_ON_INDEX),
last_dup_key((uint) - 1), using_ignore(0), last_cursor_error(0),range_lock_grabbed(false), primary_key_offsets(NULL) { added_rows(0), deleted_rows(0), last_dup_key((uint) - 1), using_ignore(0), last_cursor_error(0),range_lock_grabbed(false), primary_key_offsets(NULL) {
transaction = NULL; transaction = NULL;
} }
...@@ -1176,7 +1176,19 @@ int ha_tokudb::open(const char *name, int mode, uint test_if_locked) { ...@@ -1176,7 +1176,19 @@ int ha_tokudb::open(const char *name, int mode, uint test_if_locked) {
__close(1); __close(1);
TOKUDB_DBUG_RETURN(1); TOKUDB_DBUG_RETURN(1);
} }
//////////////////////
u_int64_t num_rows = 0;
int error = estimate_num_rows(share->file,&num_rows);
//
// estimate_num_rows should not fail under normal conditions
//
if (error == 0) {
share->rows = num_rows;
}
else {
__close(1);
TOKUDB_DBUG_RETURN(1);
}
} }
ref_length = share->ref_length; // If second open ref_length = share->ref_length; // If second open
pthread_mutex_unlock(&share->mutex); pthread_mutex_unlock(&share->mutex);
...@@ -1866,7 +1878,7 @@ cleanup: ...@@ -1866,7 +1878,7 @@ cleanup:
*/ */
ha_rows ha_tokudb::estimate_rows_upper_bound() { ha_rows ha_tokudb::estimate_rows_upper_bound() {
TOKUDB_DBUG_ENTER("ha_tokudb::estimate_rows_upper_bound"); TOKUDB_DBUG_ENTER("ha_tokudb::estimate_rows_upper_bound");
DBUG_RETURN(stats.records + HA_TOKUDB_EXTRA_ROWS); DBUG_RETURN(share->rows + HA_TOKUDB_EXTRA_ROWS);
} }
int ha_tokudb::cmp_ref(const uchar * ref1, const uchar * ref2) { int ha_tokudb::cmp_ref(const uchar * ref1, const uchar * ref2) {
...@@ -1984,6 +1996,9 @@ int ha_tokudb::write_row(uchar * record) { ...@@ -1984,6 +1996,9 @@ int ha_tokudb::write_row(uchar * record) {
if (error == DB_KEYEXIST) { if (error == DB_KEYEXIST) {
error = HA_ERR_FOUND_DUPP_KEY; error = HA_ERR_FOUND_DUPP_KEY;
} }
else if (!error) {
added_rows++;
}
TOKUDB_DBUG_RETURN(error); TOKUDB_DBUG_RETURN(error);
} }
...@@ -2265,6 +2280,9 @@ int ha_tokudb::delete_row(const uchar * record) { ...@@ -2265,6 +2280,9 @@ int ha_tokudb::delete_row(const uchar * record) {
if (error != DB_LOCK_DEADLOCK && error != DB_LOCK_NOTGRANTED) if (error != DB_LOCK_DEADLOCK && error != DB_LOCK_NOTGRANTED)
break; break;
} }
if (!error) {
deleted_rows++;
}
TOKUDB_DBUG_RETURN(error); TOKUDB_DBUG_RETURN(error);
} }
...@@ -3023,18 +3041,10 @@ void ha_tokudb::position(const uchar * record) { ...@@ -3023,18 +3041,10 @@ void ha_tokudb::position(const uchar * record) {
// 0, always success // 0, always success
// //
int ha_tokudb::info(uint flag) { int ha_tokudb::info(uint flag) {
TOKUDB_DBUG_ENTER("ha_tokudb::info %p %d", this, flag); TOKUDB_DBUG_ENTER("ha_tokudb::info %p %d %lld", this, flag, share->rows);
if (flag & HA_STATUS_VARIABLE) { if (flag & HA_STATUS_VARIABLE) {
// Just to get optimizations right // Just to get optimizations right
u_int64_t num_rows = 0; stats.records = share->rows;
int error = estimate_num_rows(share->file,&num_rows);
//
// estimate_num_rows should not fail under normal conditions
// if it does fail, just keep stats.record unchanged
//
if (error == 0) {
stats.records = num_rows;
}
stats.deleted = 0; stats.deleted = 0;
} }
if ((flag & HA_STATUS_CONST)) { if ((flag & HA_STATUS_CONST)) {
...@@ -3248,6 +3258,19 @@ int ha_tokudb::external_lock(THD * thd, int lock_type) { ...@@ -3248,6 +3258,19 @@ int ha_tokudb::external_lock(THD * thd, int lock_type) {
} }
else { else {
lock.type = TL_UNLOCK; // Unlocked lock.type = TL_UNLOCK; // Unlocked
pthread_mutex_lock(&share->mutex);
// hate dealing with comparison of signed vs unsigned, so doing this
if (deleted_rows > added_rows && share->rows < (deleted_rows - added_rows)) {
share->rows = 0;
}
else {
share->rows += (added_rows - deleted_rows);
}
pthread_mutex_unlock(&share->mutex);
added_rows = 0;
deleted_rows = 0;
if (!--trx->tokudb_lock_count) { if (!--trx->tokudb_lock_count) {
if (trx->stmt) { if (trx->stmt) {
/* /*
......
...@@ -12,6 +12,7 @@ typedef struct st_tokudb_share { ...@@ -12,6 +12,7 @@ typedef struct st_tokudb_share {
ulonglong auto_ident; ulonglong auto_ident;
ulonglong last_auto_increment; ulonglong last_auto_increment;
ha_rows rows;
DB *status_block; DB *status_block;
// //
// DB that is indexed on the primary key // DB that is indexed on the primary key
...@@ -119,6 +120,11 @@ private: ...@@ -119,6 +120,11 @@ private:
// flags that are returned in table_flags() // flags that are returned in table_flags()
// //
ulong int_table_flags; ulong int_table_flags;
//
// count on the number of rows that gets changed, such as when write_row occurs
//
ulonglong added_rows;
ulonglong deleted_rows;
// //
// index into key_file that holds DB* that is indexed on // index into key_file that holds DB* that is indexed on
// the primary_key. this->key_file[primary_index] == this->file // the primary_key. this->key_file[primary_index] == this->file
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment