mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 03:21:53 +01:00
branches/zip: Prepare for upcoming implementation of page_zip_compress()
that will require complete index information. dict_create_index_step(): invoke dict_index_add_to_cache() before btr_create() dict_index_remove_from_cache(): make public dict_index_get_if_in_cache_low(): new function, for holding dict_sys->mutex buf_flush_init_for_writing(): remove the temporary hook to page_zip_compress() page_create(): add temporary hook to page_zip_compress()
This commit is contained in:
parent
05fbb8ca9d
commit
c0ac96d9b4
5 changed files with 91 additions and 65 deletions
|
@ -16,9 +16,6 @@ Created 11/11/1995 Heikki Tuuri
|
|||
#include "ut0byte.h"
|
||||
#include "ut0lst.h"
|
||||
#include "page0page.h"
|
||||
#if 1 /* testing */
|
||||
# include "page0zip.h"
|
||||
#endif
|
||||
#include "fil0fil.h"
|
||||
#include "buf0buf.h"
|
||||
#include "buf0lru.h"
|
||||
|
@ -478,36 +475,6 @@ buf_flush_init_for_writing(
|
|||
mach_write_to_4(page + UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM,
|
||||
srv_use_checksums ?
|
||||
buf_calc_page_old_checksum(page) : BUF_NO_CHECKSUM_MAGIC);
|
||||
#if 1 /* testing */
|
||||
if (space /* skip the system tablespace */
|
||||
&& page_no != FSP_FIRST_INODE_PAGE_NO
|
||||
&& page_no % XDES_DESCRIBED_PER_PAGE > FSP_IBUF_BITMAP_OFFSET) {
|
||||
if (memcmp(page + PAGE_NEW_INFIMUM, "infimum", 8)) {
|
||||
fprintf(stderr, "page %lu:%lu: cannot compress\n",
|
||||
(ulong) space, (ulong) page_no);
|
||||
} else {
|
||||
byte zip_data[16384];
|
||||
page_zip_des_t* page_zip =
|
||||
&buf_block_align(page)->page_zip;
|
||||
page_zip->data = zip_data;
|
||||
page_zip->size = sizeof zip_data;
|
||||
page_zip->m_start = page_zip->m_end = 0;
|
||||
|
||||
ut_a(page_zip_compress(page_zip, page));
|
||||
|
||||
fprintf(stderr,
|
||||
"page %lu:%lu (%lu): zip size==%lu+%lu\n",
|
||||
(ulong) space, (ulong) page_no,
|
||||
(ulong) mach_read_from_2(page
|
||||
+ (PAGE_HEADER + PAGE_LEVEL)),
|
||||
(ulong) page_zip->m_start,
|
||||
(ulong) 2
|
||||
* (page_dir_get_n_heap(page_zip->data) - 2));
|
||||
|
||||
page_zip->data = NULL;
|
||||
}
|
||||
}
|
||||
#endif /* testing */
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
|
|
|
@ -1084,19 +1084,39 @@ dict_create_index_step(
|
|||
|
||||
return(thr);
|
||||
} else {
|
||||
node->state = INDEX_CREATE_INDEX_TREE;
|
||||
node->state = INDEX_ADD_TO_CACHE;
|
||||
}
|
||||
}
|
||||
|
||||
if (node->state == INDEX_ADD_TO_CACHE) {
|
||||
|
||||
dulint index_id = node->index->id;
|
||||
|
||||
success = dict_index_add_to_cache(node->table, node->index,
|
||||
FIL_NULL);
|
||||
|
||||
ut_a(success);
|
||||
|
||||
node->index = dict_index_get_if_in_cache_low(index_id);
|
||||
ut_a(node->index);
|
||||
|
||||
err = DB_SUCCESS;
|
||||
|
||||
node->state = INDEX_CREATE_INDEX_TREE;
|
||||
}
|
||||
|
||||
if (node->state == INDEX_CREATE_INDEX_TREE) {
|
||||
|
||||
err = dict_create_index_tree_step(node);
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
dict_index_remove_from_cache(node->table, node->index);
|
||||
node->index = NULL;
|
||||
|
||||
goto function_exit;
|
||||
}
|
||||
|
||||
node->index->tree->page = node->page_no;
|
||||
node->state = INDEX_COMMIT_WORK;
|
||||
}
|
||||
|
||||
|
@ -1106,23 +1126,13 @@ dict_create_index_step(
|
|||
(CREATE INDEX does NOT currently do an implicit commit of
|
||||
the current transaction) */
|
||||
|
||||
node->state = INDEX_ADD_TO_CACHE;
|
||||
node->state = INDEX_CREATE_INDEX_TREE;
|
||||
|
||||
/* thr->run_node = node->commit_node;
|
||||
|
||||
return(thr); */
|
||||
}
|
||||
|
||||
if (node->state == INDEX_ADD_TO_CACHE) {
|
||||
|
||||
success = dict_index_add_to_cache(node->table, node->index,
|
||||
node->page_no);
|
||||
|
||||
ut_a(success);
|
||||
|
||||
err = DB_SUCCESS;
|
||||
}
|
||||
|
||||
function_exit:
|
||||
trx->error_state = err;
|
||||
|
||||
|
|
|
@ -105,14 +105,6 @@ dict_col_remove_from_cache(
|
|||
/*=======================*/
|
||||
dict_table_t* table, /* in: table */
|
||||
dict_col_t* col); /* in: column */
|
||||
/**************************************************************************
|
||||
Removes an index from the dictionary cache. */
|
||||
static
|
||||
void
|
||||
dict_index_remove_from_cache(
|
||||
/*=========================*/
|
||||
dict_table_t* table, /* in: table */
|
||||
dict_index_t* index); /* in, own: index */
|
||||
/***********************************************************************
|
||||
Copies fields contained in index2 to index1. */
|
||||
static
|
||||
|
@ -1512,7 +1504,7 @@ dict_index_add_to_cache(
|
|||
|
||||
/**************************************************************************
|
||||
Removes an index from the dictionary cache. */
|
||||
static
|
||||
|
||||
void
|
||||
dict_index_remove_from_cache(
|
||||
/*=========================*/
|
||||
|
@ -3582,22 +3574,21 @@ syntax_error:
|
|||
/*==================== END OF FOREIGN KEY PROCESSING ====================*/
|
||||
|
||||
/**************************************************************************
|
||||
Returns an index object if it is found in the dictionary cache. */
|
||||
Returns an index object if it is found in the dictionary cache.
|
||||
Assumes that dict_sys->mutex is already being held. */
|
||||
|
||||
dict_index_t*
|
||||
dict_index_get_if_in_cache(
|
||||
/*=======================*/
|
||||
dict_index_get_if_in_cache_low(
|
||||
/*===========================*/
|
||||
/* out: index, NULL if not found */
|
||||
dulint index_id) /* in: index id */
|
||||
{
|
||||
dict_table_t* table;
|
||||
dict_index_t* index;
|
||||
|
||||
if (dict_sys == NULL) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
mutex_enter(&(dict_sys->mutex));
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ut_ad(mutex_own(&(dict_sys->mutex)));
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
table = UT_LIST_GET_FIRST(dict_sys->table_LRU);
|
||||
|
||||
|
@ -3607,7 +3598,7 @@ dict_index_get_if_in_cache(
|
|||
while (index) {
|
||||
if (0 == ut_dulint_cmp(index->id, index_id)) {
|
||||
|
||||
goto found;
|
||||
return(index);
|
||||
}
|
||||
|
||||
index = UT_LIST_GET_NEXT(indexes, index);
|
||||
|
@ -3616,8 +3607,28 @@ dict_index_get_if_in_cache(
|
|||
table = UT_LIST_GET_NEXT(table_LRU, table);
|
||||
}
|
||||
|
||||
index = NULL;
|
||||
found:
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Returns an index object if it is found in the dictionary cache. */
|
||||
|
||||
dict_index_t*
|
||||
dict_index_get_if_in_cache(
|
||||
/*=======================*/
|
||||
/* out: index, NULL if not found */
|
||||
dulint index_id) /* in: index id */
|
||||
{
|
||||
dict_index_t* index;
|
||||
|
||||
if (dict_sys == NULL) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
mutex_enter(&(dict_sys->mutex));
|
||||
|
||||
index = dict_index_get_if_in_cache_low(index_id);
|
||||
|
||||
mutex_exit(&(dict_sys->mutex));
|
||||
|
||||
return(index);
|
||||
|
|
|
@ -524,6 +524,14 @@ dict_index_add_to_cache(
|
|||
dict_index_t* index, /* in, own: index; NOTE! The index memory
|
||||
object is freed in this function! */
|
||||
ulint page_no);/* in: root page number of the index */
|
||||
/**************************************************************************
|
||||
Removes an index from the dictionary cache. */
|
||||
|
||||
void
|
||||
dict_index_remove_from_cache(
|
||||
/*=========================*/
|
||||
dict_table_t* table, /* in: table */
|
||||
dict_index_t* index); /* in, own: index */
|
||||
/************************************************************************
|
||||
Gets the number of fields in the internal representation of an index,
|
||||
including fields added by the dictionary system. */
|
||||
|
@ -742,6 +750,15 @@ dict_is_mixed_table_rec(
|
|||
dict_table_t* table, /* in: table in a mixed cluster */
|
||||
rec_t* rec); /* in: user record in the clustered index */
|
||||
/**************************************************************************
|
||||
Returns an index object if it is found in the dictionary cache.
|
||||
Assumes that dict_sys->mutex is already being held. */
|
||||
|
||||
dict_index_t*
|
||||
dict_index_get_if_in_cache_low(
|
||||
/*===========================*/
|
||||
/* out: index, NULL if not found */
|
||||
dulint index_id); /* in: index id */
|
||||
/**************************************************************************
|
||||
Returns an index object if it is found in the dictionary cache. */
|
||||
|
||||
dict_index_t*
|
||||
|
|
|
@ -378,6 +378,9 @@ page_create(
|
|||
page_t* page;
|
||||
dict_index_t* index;
|
||||
ulint* offsets;
|
||||
#if 1 /* testing */
|
||||
byte zip_data[512];
|
||||
#endif
|
||||
|
||||
if (UNIV_LIKELY(comp)) {
|
||||
index = srv_sys->dummy_ind2;
|
||||
|
@ -392,6 +395,13 @@ page_create(
|
|||
ut_ad(PAGE_BTR_IBUF_FREE_LIST_NODE + FLST_NODE_SIZE
|
||||
<= PAGE_DATA);
|
||||
|
||||
/* The infimum and supremum records use a dummy index. */
|
||||
if (UNIV_LIKELY(comp)) {
|
||||
index = srv_sys->dummy_ind2;
|
||||
} else {
|
||||
index = srv_sys->dummy_ind1;
|
||||
}
|
||||
|
||||
/* 1. INCREMENT MODIFY CLOCK */
|
||||
buf_frame_modify_clock_inc(frame);
|
||||
|
||||
|
@ -506,6 +516,14 @@ page_create(
|
|||
rec_set_next_offs_old(supremum_rec, 0);
|
||||
}
|
||||
|
||||
#if 1 /* testing */
|
||||
if (UNIV_LIKELY(comp)) {
|
||||
page_zip = &buf_block_align(page)->page_zip;
|
||||
page_zip->data = zip_data;
|
||||
page_zip->size = sizeof zip_data;
|
||||
page_zip->m_start = page_zip->m_end = 0;
|
||||
}
|
||||
#endif
|
||||
if (UNIV_LIKELY_NULL(page_zip)) {
|
||||
ut_ad(comp);
|
||||
|
||||
|
@ -515,6 +533,9 @@ page_create(
|
|||
ut_error;
|
||||
}
|
||||
}
|
||||
#if 1 /* testing */
|
||||
buf_block_align(page)->page_zip.data = 0;
|
||||
#endif
|
||||
|
||||
return(page);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue