summaryrefslogtreecommitdiff
path: root/innobase/buf
diff options
context:
space:
mode:
authormonty@mashka.mysql.fi <>2002-07-25 22:46:28 +0300
committermonty@mashka.mysql.fi <>2002-07-25 22:46:28 +0300
commitbc035c71f1d94649253e4dac5fb8e5c981c7d834 (patch)
treef38c137c73206e3d059517b2bcab6a4a43c957f9 /innobase/buf
parentb126501bf3888b09fad83dbd2894709c45f009fc (diff)
parent3c9f1a9ae47e4fcbede526430b0171e8ba17d948 (diff)
downloadmariadb-git-bc035c71f1d94649253e4dac5fb8e5c981c7d834.tar.gz
Merge with 3.23.51
Fixed wrong usage of sprintf() in ha_innodb.cc
Diffstat (limited to 'innobase/buf')
-rw-r--r--innobase/buf/buf0buf.c78
-rw-r--r--innobase/buf/buf0rea.c29
2 files changed, 94 insertions, 13 deletions
diff --git a/innobase/buf/buf0buf.c b/innobase/buf/buf0buf.c
index e840e9f143d..663c6cefce6 100644
--- a/innobase/buf/buf0buf.c
+++ b/innobase/buf/buf0buf.c
@@ -1126,12 +1126,50 @@ buf_page_get_known_nowait(
}
/************************************************************************
+Inits a page to the buffer buf_pool, for use in ibbackup --restore. */
+
+void
+buf_page_init_for_backup_restore(
+/*=============================*/
+ ulint space, /* in: space id */
+ ulint offset, /* in: offset of the page within space
+ in units of a page */
+ buf_block_t* block) /* in: block to init */
+{
+ /* Set the state of the block */
+ block->magic_n = BUF_BLOCK_MAGIC_N;
+
+ block->state = BUF_BLOCK_FILE_PAGE;
+ block->space = space;
+ block->offset = offset;
+
+ block->lock_hash_val = 0;
+ block->lock_mutex = NULL;
+
+ block->freed_page_clock = 0;
+
+ block->newest_modification = ut_dulint_zero;
+ block->oldest_modification = ut_dulint_zero;
+
+ block->accessed = FALSE;
+ block->buf_fix_count = 0;
+ block->io_fix = 0;
+
+ block->n_hash_helps = 0;
+ block->is_hashed = FALSE;
+ block->n_fields = 1;
+ block->n_bytes = 0;
+ block->side = BTR_SEARCH_LEFT_SIDE;
+
+ block->file_page_was_freed = FALSE;
+}
+
+/************************************************************************
Inits a page to the buffer buf_pool. */
static
void
buf_page_init(
/*==========*/
- /* out: pointer to the block */
ulint space, /* in: space id */
ulint offset, /* in: offset of the page within space
in units of a page */
@@ -1141,6 +1179,8 @@ buf_page_init(
ut_ad(block->state == BUF_BLOCK_READY_FOR_USE);
/* Set the state of the block */
+ block->magic_n = BUF_BLOCK_MAGIC_N;
+
block->state = BUF_BLOCK_FILE_PAGE;
block->space = space;
block->offset = offset;
@@ -1758,8 +1798,10 @@ buf_get_n_pending_ios(void)
Prints info of the buffer i/o. */
void
-buf_print_io(void)
-/*==============*/
+buf_print_io(
+/*=========*/
+ char* buf, /* in/out: buffer where to print */
+ char* buf_end)/* in: buffer end */
{
time_t current_time;
double time_elapsed;
@@ -1767,19 +1809,28 @@ buf_print_io(void)
ut_ad(buf_pool);
+ if (buf_end - buf < 400) {
+
+ return;
+ }
+
size = buf_pool_get_curr_size() / UNIV_PAGE_SIZE;
mutex_enter(&(buf_pool->mutex));
- printf("Free list length %lu \n", UT_LIST_GET_LEN(buf_pool->free));
- printf("LRU list length %lu \n", UT_LIST_GET_LEN(buf_pool->LRU));
- printf("Flush list length %lu \n",
+ buf += sprintf(buf,
+ "Free list length %lu \n", UT_LIST_GET_LEN(buf_pool->free));
+ buf += sprintf(buf,
+ "LRU list length %lu \n", UT_LIST_GET_LEN(buf_pool->LRU));
+ buf += sprintf(buf,
+ "Flush list length %lu \n",
UT_LIST_GET_LEN(buf_pool->flush_list));
- printf("Buffer pool size %lu\n", size);
+ buf += sprintf(buf, "Buffer pool size %lu\n", size);
- printf("Pending reads %lu \n", buf_pool->n_pend_reads);
+ buf += sprintf(buf, "Pending reads %lu \n", buf_pool->n_pend_reads);
- printf("Pending writes: LRU %lu, flush list %lu, single page %lu\n",
+ buf += sprintf(buf,
+ "Pending writes: LRU %lu, flush list %lu, single page %lu\n",
buf_pool->n_flush[BUF_FLUSH_LRU],
buf_pool->n_flush[BUF_FLUSH_LIST],
buf_pool->n_flush[BUF_FLUSH_SINGLE_PAGE]);
@@ -1789,10 +1840,10 @@ buf_print_io(void)
buf_pool->last_printout_time = current_time;
- printf("Pages read %lu, created %lu, written %lu\n",
+ buf += sprintf(buf, "Pages read %lu, created %lu, written %lu\n",
buf_pool->n_pages_read, buf_pool->n_pages_created,
buf_pool->n_pages_written);
- printf("%.2f reads/s, %.2f creates/s, %.2f writes/s\n",
+ buf += sprintf(buf, "%.2f reads/s, %.2f creates/s, %.2f writes/s\n",
(buf_pool->n_pages_read - buf_pool->n_pages_read_old)
/ time_elapsed,
(buf_pool->n_pages_created - buf_pool->n_pages_created_old)
@@ -1801,13 +1852,14 @@ buf_print_io(void)
/ time_elapsed);
if (buf_pool->n_page_gets > buf_pool->n_page_gets_old) {
- printf("Buffer pool hit rate %lu / 1000\n",
+ buf += sprintf(buf, "Buffer pool hit rate %lu / 1000\n",
1000
- ((1000 *
(buf_pool->n_pages_read - buf_pool->n_pages_read_old))
/ (buf_pool->n_page_gets - buf_pool->n_page_gets_old)));
} else {
- printf("No buffer pool activity since the last printout\n");
+ buf += sprintf(buf,
+ "No buffer pool activity since the last printout\n");
}
buf_pool->n_page_gets_old = buf_pool->n_page_gets;
diff --git a/innobase/buf/buf0rea.c b/innobase/buf/buf0rea.c
index db187cdd896..475a5bd9cbd 100644
--- a/innobase/buf/buf0rea.c
+++ b/innobase/buf/buf0rea.c
@@ -100,6 +100,11 @@ buf_read_page_low(
block = buf_page_init_for_read(mode, space, offset);
if (block != NULL) {
+ if (buf_debug_prints) {
+ printf("Posting read request for page %lu, sync %lu\n",
+ offset, sync);
+ }
+
fil_io(OS_FILE_READ | wake_later,
sync, space, offset, 0, UNIV_PAGE_SIZE,
(void*)block->frame, (void*)block);
@@ -467,6 +472,12 @@ buf_read_ahead_linear(
count = 0;
+ /* Since Windows XP seems to schedule the i/o handler thread
+ very eagerly, and consequently it does not wait for the
+ full read batch to be posted, we use special heuristics here */
+
+ os_aio_simulated_put_read_threads_to_sleep();
+
for (i = low; i < high; i++) {
/* It is only sensible to do read-ahead in the non-sync
aio mode: hence FALSE as the first parameter */
@@ -556,16 +567,34 @@ buf_read_recv_pages(
highest page number the last in the array */
ulint n_stored) /* in: number of page numbers in the array */
{
+ ulint count;
ulint i;
for (i = 0; i < n_stored; i++) {
+ count = 0;
+
+ os_aio_print_debug = FALSE;
+
while (buf_pool->n_pend_reads >= RECV_POOL_N_FREE_BLOCKS / 2) {
os_aio_simulated_wake_handler_threads();
os_thread_sleep(500000);
+
+ count++;
+
+ if (count > 100) {
+ fprintf(stderr,
+"InnoDB: Error: InnoDB has waited for 50 seconds for pending\n"
+"InnoDB: reads to the buffer pool to be finished.\n"
+"InnoDB: Number of pending reads %lu\n", buf_pool->n_pend_reads);
+
+ os_aio_print_debug = TRUE;
+ }
}
+ os_aio_print_debug = FALSE;
+
if ((i + 1 == n_stored) && sync) {
buf_read_page_low(TRUE, BUF_READ_ANY_PAGE, space,
page_nos[i]);