/*************************************************************//** Prints info of a hash table. */ UNIV_INTERN void ha_print_info( /*==========*/ FILE* file, /*!< in: file where to print */ hash_table_t* table) /*!< in: hash table */ { #ifdef UNIV_DEBUG /* Some of the code here is disabled for performance reasons in production builds, see http://bugs.mysql.com/36941 */ #define PRINT_USED_CELLS #endif /* UNIV_DEBUG */ #ifdef PRINT_USED_CELLS hash_cell_t* cell; ulint cells = 0; ulint i; #endif /* PRINT_USED_CELLS */ ulint n_bufs; ut_ad(table); ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); #ifdef PRINT_USED_CELLS for (i = 0; i < hash_get_n_cells(table); i++) { cell = hash_get_nth_cell(table, i); if (cell->node) { cells++; } } #endif /* PRINT_USED_CELLS */ fprintf(file, "Hash table size %lu", (ulong) hash_get_n_cells(table)); #ifdef PRINT_USED_CELLS fprintf(file, ", used cells %lu", (ulong) cells); #endif /* PRINT_USED_CELLS */ if (table->heaps == NULL && table->heap != NULL) { /* This calculation is intended for the adaptive hash index: how many buffer frames we have reserved? */ n_bufs = UT_LIST_GET_LEN(table->heap->base) - 1; if (table->heap->free_block) { n_bufs++; } fprintf(file, ", node heap has %lu buffer(s)\n", (ulong) n_bufs); } }
/*************************************************************//** Empties a hash table and frees the memory heaps. */ UNIV_INTERN void ha_clear( /*=====*/ hash_table_t* table) /*!< in, own: hash table */ { ulint i; ulint n; ut_ad(table); ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); #ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&btr_search_latch, RW_LOCK_EXCLUSIVE)); #endif /* UNIV_SYNC_DEBUG */ #ifndef UNIV_HOTBACKUP /* Free the memory heaps. */ n = table->n_mutexes; for (i = 0; i < n; i++) { mem_heap_free(table->heaps[i]); } #endif /* !UNIV_HOTBACKUP */ /* Clear the hash table. */ n = hash_get_n_cells(table); for (i = 0; i < n; i++) { hash_get_nth_cell(table, i)->node = NULL; } }
/*************************************************************//** Validates a given range of the cells in hash table. @return TRUE if ok */ UNIV_INTERN ibool ha_validate( /*========*/ hash_table_t* table, /*!< in: hash table */ ulint start_index, /*!< in: start index */ ulint end_index) /*!< in: end index */ { hash_cell_t* cell; ha_node_t* node; ibool ok = TRUE; ulint i; ut_ad(table); ut_ad(table->magic_n == HASH_TABLE_MAGIC_N); ut_a(start_index <= end_index); ut_a(start_index < hash_get_n_cells(table)); ut_a(end_index < hash_get_n_cells(table)); for (i = start_index; i <= end_index; i++) { cell = hash_get_nth_cell(table, i); node = cell->node; while (node) { if (hash_calc_hash(node->fold, table) != i) { ut_print_timestamp(stderr); fprintf(stderr, "InnoDB: Error: hash table node" " fold value %lu does not\n" "InnoDB: match the cell number %lu.\n", (ulong) node->fold, (ulong) i); ok = FALSE; } node = node->next; } } return(ok); }