Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
d2d7aa48
Commit
d2d7aa48
authored
Apr 04, 2011
by
Vasil Dimov
Browse files
Options
Browse Files
Download
Plain Diff
Merge mysql-5.1-innodb -> mysql-5.1
parents
7aa81e2a
ddec6ecd
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
234 additions
and
129 deletions
+234
-129
storage/innobase/include/sync0arr.h
storage/innobase/include/sync0arr.h
+7
-4
storage/innobase/srv/srv0srv.c
storage/innobase/srv/srv0srv.c
+14
-5
storage/innobase/sync/sync0arr.c
storage/innobase/sync/sync0arr.c
+27
-9
storage/innodb_plugin/ChangeLog
storage/innodb_plugin/ChangeLog
+16
-0
storage/innodb_plugin/btr/btr0cur.c
storage/innodb_plugin/btr/btr0cur.c
+40
-36
storage/innodb_plugin/btr/btr0sea.c
storage/innodb_plugin/btr/btr0sea.c
+2
-2
storage/innodb_plugin/buf/buf0buf.c
storage/innodb_plugin/buf/buf0buf.c
+30
-11
storage/innodb_plugin/buf/buf0lru.c
storage/innodb_plugin/buf/buf0lru.c
+46
-41
storage/innodb_plugin/include/buf0buf.h
storage/innodb_plugin/include/buf0buf.h
+3
-1
storage/innodb_plugin/include/sync0arr.h
storage/innodb_plugin/include/sync0arr.h
+5
-2
storage/innodb_plugin/page/page0zip.c
storage/innodb_plugin/page/page0zip.c
+8
-9
storage/innodb_plugin/srv/srv0srv.c
storage/innodb_plugin/srv/srv0srv.c
+10
-1
storage/innodb_plugin/sync/sync0arr.c
storage/innodb_plugin/sync/sync0arr.c
+25
-7
storage/innodb_plugin/trx/trx0i_s.c
storage/innodb_plugin/trx/trx0i_s.c
+1
-1
No files found.
storage/innobase/include/sync0arr.h
View file @
d2d7aa48
...
...
@@ -93,10 +93,13 @@ sync_arr_wake_threads_if_sema_free(void);
Prints warnings of long semaphore waits to stderr. */
ibool
sync_array_print_long_waits
(
void
);
/*=============================*/
/* out: TRUE if fatal semaphore wait threshold
was exceeded */
sync_array_print_long_waits
(
/*========================*/
/* out: TRUE if fatal semaphore wait threshold
was exceeded */
os_thread_id_t
*
waiter
,
/* out: longest waiting thread */
const
void
**
sema
)
/* out: longest-waited-for semaphore */
__attribute__
((
nonnull
));
/************************************************************************
Validates the integrity of the wait array. Checks
that the number of reserved cells equals the count variable. */
...
...
storage/innobase/srv/srv0srv.c
View file @
d2d7aa48
...
...
@@ -2180,9 +2180,15 @@ srv_error_monitor_thread(
os_thread_create */
{
/* number of successive fatal timeouts observed */
ulint
fatal_cnt
=
0
;
dulint
old_lsn
;
dulint
new_lsn
;
ulint
fatal_cnt
=
0
;
dulint
old_lsn
;
dulint
new_lsn
;
/* longest waiting thread for a semaphore */
os_thread_id_t
waiter
=
os_thread_get_curr_id
();
os_thread_id_t
old_waiter
=
waiter
;
/* the semaphore that is being waited for */
const
void
*
sema
=
NULL
;
const
void
*
old_sema
=
NULL
;
old_lsn
=
srv_start_lsn
;
...
...
@@ -2224,10 +2230,11 @@ srv_error_monitor_thread(
/* In case mutex_exit is not a memory barrier, it is
theoretically possible some threads are left waiting though
the semaphore is already released. Wake up those threads: */
sync_arr_wake_threads_if_sema_free
();
if
(
sync_array_print_long_waits
())
{
if
(
sync_array_print_long_waits
(
&
waiter
,
&
sema
)
&&
sema
==
old_sema
&&
os_thread_eq
(
waiter
,
old_waiter
))
{
fatal_cnt
++
;
if
(
fatal_cnt
>
10
)
{
...
...
@@ -2242,6 +2249,8 @@ srv_error_monitor_thread(
}
}
else
{
fatal_cnt
=
0
;
old_waiter
=
waiter
;
old_sema
=
sema
;
}
/* Flush stderr so that a database user gets the output
...
...
storage/innobase/sync/sync0arr.c
View file @
d2d7aa48
...
...
@@ -916,10 +916,12 @@ sync_arr_wake_threads_if_sema_free(void)
Prints warnings of long semaphore waits to stderr. */
ibool
sync_array_print_long_waits
(
void
)
/*=============================*/
/* out: TRUE if fatal semaphore wait threshold
was exceeded */
sync_array_print_long_waits
(
/*========================*/
/* out: TRUE if fatal semaphore wait threshold
was exceeded */
os_thread_id_t
*
waiter
,
/* out: longest waiting thread */
const
void
**
sema
)
/* out: longest-waited-for semaphore */
{
sync_cell_t
*
cell
;
ibool
old_val
;
...
...
@@ -927,24 +929,40 @@ sync_array_print_long_waits(void)
ulint
i
;
ulint
fatal_timeout
=
srv_fatal_semaphore_wait_threshold
;
ibool
fatal
=
FALSE
;
double
longest_diff
=
0
;
for
(
i
=
0
;
i
<
sync_primary_wait_array
->
n_cells
;
i
++
)
{
double
diff
;
void
*
wait_object
;
cell
=
sync_array_get_nth_cell
(
sync_primary_wait_array
,
i
);
if
(
cell
->
wait_object
!=
NULL
&&
cell
->
waiting
&&
difftime
(
time
(
NULL
),
cell
->
reservation_time
)
>
240
)
{
wait_object
=
cell
->
wait_object
;
if
(
wait_object
==
NULL
||
!
cell
->
waiting
)
{
continue
;
}
diff
=
difftime
(
time
(
NULL
),
cell
->
reservation_time
);
if
(
diff
>
240
)
{
fputs
(
"InnoDB: Warning: a long semaphore wait:
\n
"
,
stderr
);
sync_array_cell_print
(
stderr
,
cell
);
noticed
=
TRUE
;
}
if
(
cell
->
wait_object
!=
NULL
&&
cell
->
waiting
&&
difftime
(
time
(
NULL
),
cell
->
reservation_time
)
>
fatal_timeout
)
{
if
(
diff
>
fatal_timeout
)
{
fatal
=
TRUE
;
}
if
(
diff
>
longest_diff
)
{
longest_diff
=
diff
;
*
sema
=
wait_object
;
*
waiter
=
cell
->
thread
;
}
}
if
(
noticed
)
{
...
...
storage/innodb_plugin/ChangeLog
View file @
d2d7aa48
2011-03-30 The InnoDB Team
* srv/srv0srv.c, sync/sync0arr.h, sync/sync0arr.c:
Fix Bug#11877216 InnoDB too eager to commit suicide on a busy server
2011-03-15 The InnoDB Team
* btr/btr0cur.c, page/page0zip.c:
Fix Bug#11849231 inflateInit() invoked without initializing all memory
2011-02-28 The InnoDB Team
* btr/btr0sea.c, buf/buf0buf.c, buf/buf0lru.c:
Fix Bug#58549 Race condition in buf_LRU_drop_page_hash_for_tablespace()
and compressed tables
2011-02-15 The InnoDB Team
* sync/sync0rw.c, innodb_bug59307.test:
...
...
storage/innodb_plugin/btr/btr0cur.c
View file @
d2d7aa48
...
...
@@ -4627,27 +4627,45 @@ btr_copy_blob_prefix(
/*******************************************************************//**
Copies the prefix of a compressed BLOB. The clustered index record
that points to this BLOB must be protected by a lock or a page latch. */
that points to this BLOB must be protected by a lock or a page latch.
@return number of bytes written to buf */
static
void
ulint
btr_copy_zblob_prefix
(
/*==================*/
z_stream
*
d_stream
,
/*!< in/out: the decompressing stream */
byte
*
buf
,
/*!< out: the externally stored part of
the field, or a prefix of it */
ulint
len
,
/*!< in: length of buf, in bytes */
ulint
zip_size
,
/*!< in: compressed BLOB page size */
ulint
space_id
,
/*!< in: space id of the BLOB pages */
ulint
page_no
,
/*!< in: page number of the first BLOB page */
ulint
offset
)
/*!< in: offset on the first BLOB page */
{
ulint
page_type
=
FIL_PAGE_TYPE_ZBLOB
;
ulint
page_type
=
FIL_PAGE_TYPE_ZBLOB
;
mem_heap_t
*
heap
;
int
err
;
z_stream
d_stream
;
d_stream
.
next_out
=
buf
;
d_stream
.
avail_out
=
len
;
d_stream
.
next_in
=
Z_NULL
;
d_stream
.
avail_in
=
0
;
/* Zlib inflate needs 32 kilobytes for the default
window size, plus a few kilobytes for small objects. */
heap
=
mem_heap_create
(
40000
);
page_zip_set_alloc
(
&
d_stream
,
heap
);
ut_ad
(
ut_is_2pow
(
zip_size
));
ut_ad
(
zip_size
>=
PAGE_ZIP_MIN_SIZE
);
ut_ad
(
zip_size
<=
UNIV_PAGE_SIZE
);
ut_ad
(
space_id
);
err
=
inflateInit
(
&
d_stream
);
ut_a
(
err
==
Z_OK
);
for
(;;)
{
buf_page_t
*
bpage
;
int
err
;
ulint
next_page_no
;
/* There is no latch on bpage directly. Instead,
...
...
@@ -4663,7 +4681,7 @@ btr_copy_zblob_prefix(
" compressed BLOB"
" page %lu space %lu
\n
"
,
(
ulong
)
page_no
,
(
ulong
)
space_id
);
return
;
goto
func_exit
;
}
if
(
UNIV_UNLIKELY
...
...
@@ -4689,13 +4707,13 @@ btr_copy_zblob_prefix(
offset
+=
4
;
}
d_stream
->
next_in
=
bpage
->
zip
.
data
+
offset
;
d_stream
->
avail_in
=
zip_size
-
offset
;
d_stream
.
next_in
=
bpage
->
zip
.
data
+
offset
;
d_stream
.
avail_in
=
zip_size
-
offset
;
err
=
inflate
(
d_stream
,
Z_NO_FLUSH
);
err
=
inflate
(
&
d_stream
,
Z_NO_FLUSH
);
switch
(
err
)
{
case
Z_OK
:
if
(
!
d_stream
->
avail_out
)
{
if
(
!
d_stream
.
avail_out
)
{
goto
end_of_blob
;
}
break
;
...
...
@@ -4712,13 +4730,13 @@ btr_copy_zblob_prefix(
" compressed BLOB"
" page %lu space %lu returned %d (%s)
\n
"
,
(
ulong
)
page_no
,
(
ulong
)
space_id
,
err
,
d_stream
->
msg
);
err
,
d_stream
.
msg
);
case
Z_BUF_ERROR
:
goto
end_of_blob
;
}
if
(
next_page_no
==
FIL_NULL
)
{
if
(
!
d_stream
->
avail_in
)
{
if
(
!
d_stream
.
avail_in
)
{
ut_print_timestamp
(
stderr
);
fprintf
(
stderr
,
" InnoDB: unexpected end of"
...
...
@@ -4727,7 +4745,7 @@ btr_copy_zblob_prefix(
(
ulong
)
page_no
,
(
ulong
)
space_id
);
}
else
{
err
=
inflate
(
d_stream
,
Z_FINISH
);
err
=
inflate
(
&
d_stream
,
Z_FINISH
);
switch
(
err
)
{
case
Z_STREAM_END
:
case
Z_BUF_ERROR
:
...
...
@@ -4739,7 +4757,7 @@ btr_copy_zblob_prefix(
end_of_blob:
buf_page_release_zip
(
bpage
);
return
;
goto
func_exit
;
}
buf_page_release_zip
(
bpage
);
...
...
@@ -4751,6 +4769,12 @@ btr_copy_zblob_prefix(
offset
=
FIL_PAGE_NEXT
;
page_type
=
FIL_PAGE_TYPE_ZBLOB2
;
}
func_exit:
inflateEnd
(
&
d_stream
);
mem_heap_free
(
heap
);
UNIV_MEM_ASSERT_RW
(
buf
,
d_stream
.
total_out
);
return
(
d_stream
.
total_out
);
}
/*******************************************************************//**
...
...
@@ -4776,28 +4800,8 @@ btr_copy_externally_stored_field_prefix_low(
}
if
(
UNIV_UNLIKELY
(
zip_size
))
{
int
err
;
z_stream
d_stream
;
mem_heap_t
*
heap
;
/* Zlib inflate needs 32 kilobytes for the default
window size, plus a few kilobytes for small objects. */
heap
=
mem_heap_create
(
40000
);
page_zip_set_alloc
(
&
d_stream
,
heap
);
err
=
inflateInit
(
&
d_stream
);
ut_a
(
err
==
Z_OK
);
d_stream
.
next_out
=
buf
;
d_stream
.
avail_out
=
len
;
d_stream
.
avail_in
=
0
;
btr_copy_zblob_prefix
(
&
d_stream
,
zip_size
,
space_id
,
page_no
,
offset
);
inflateEnd
(
&
d_stream
);
mem_heap_free
(
heap
);
UNIV_MEM_ASSERT_RW
(
buf
,
d_stream
.
total_out
);
return
(
d_stream
.
total_out
);
return
(
btr_copy_zblob_prefix
(
buf
,
len
,
zip_size
,
space_id
,
page_no
,
offset
));
}
else
{
return
(
btr_copy_blob_prefix
(
buf
,
len
,
space_id
,
page_no
,
offset
));
...
...
storage/innodb_plugin/btr/btr0sea.c
View file @
d2d7aa48
...
...
@@ -1201,8 +1201,8 @@ btr_search_drop_page_hash_when_freed(
having to fear a deadlock. */
block
=
buf_page_get_gen
(
space
,
zip_size
,
page_no
,
RW_S_LATCH
,
NULL
,
BUF_GET
_IF_IN_POOL
,
__FILE__
,
__LINE__
,
&
mtr
);
BUF_PEEK
_IF_IN_POOL
,
__FILE__
,
__LINE__
,
&
mtr
);
/* Because the buffer pool mutex was released by
buf_page_peek_if_search_hashed(), it is possible that the
block was removed from the buffer pool by another thread
...
...
storage/innodb_plugin/buf/buf0buf.c
View file @
d2d7aa48
...
...
@@ -1893,16 +1893,19 @@ buf_block_align(
/* TODO: protect buf_pool->chunks with a mutex (it will
currently remain constant after buf_pool_init()) */
for
(
chunk
=
buf_pool
->
chunks
,
i
=
buf_pool
->
n_chunks
;
i
--
;
chunk
++
)
{
lint
offs
=
ptr
-
chunk
->
blocks
->
frame
;
ulint
offs
;
if
(
UNIV_UNLIKELY
(
offs
<
0
))
{
if
(
UNIV_UNLIKELY
(
ptr
<
chunk
->
blocks
->
frame
))
{
continue
;
}
/* else */
offs
=
ptr
-
chunk
->
blocks
->
frame
;
offs
>>=
UNIV_PAGE_SIZE_SHIFT
;
if
(
UNIV_LIKELY
(
(
ulint
)
offs
<
chunk
->
size
))
{
if
(
UNIV_LIKELY
(
offs
<
chunk
->
size
))
{
buf_block_t
*
block
=
&
chunk
->
blocks
[
offs
];
/* The function buf_chunk_init() invokes
...
...
@@ -2028,7 +2031,7 @@ buf_page_get_gen(
ulint
rw_latch
,
/*!< in: RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */
buf_block_t
*
guess
,
/*!< in: guessed block or NULL */
ulint
mode
,
/*!< in: BUF_GET, BUF_GET_IF_IN_POOL,
BUF_GET_NO_LATCH */
BUF_
PEEK_IF_IN_POOL, BUF_
GET_NO_LATCH */
const
char
*
file
,
/*!< in: file name */
ulint
line
,
/*!< in: line where called */
mtr_t
*
mtr
)
/*!< in: mini-transaction */
...
...
@@ -2044,9 +2047,19 @@ buf_page_get_gen(
ut_ad
((
rw_latch
==
RW_S_LATCH
)
||
(
rw_latch
==
RW_X_LATCH
)
||
(
rw_latch
==
RW_NO_LATCH
));
ut_ad
((
mode
!=
BUF_GET_NO_LATCH
)
||
(
rw_latch
==
RW_NO_LATCH
));
ut_ad
((
mode
==
BUF_GET
)
||
(
mode
==
BUF_GET_IF_IN_POOL
)
||
(
mode
==
BUF_GET_NO_LATCH
));
#ifdef UNIV_DEBUG
switch
(
mode
)
{
case
BUF_GET_NO_LATCH
:
ut_ad
(
rw_latch
==
RW_NO_LATCH
);
break
;
case
BUF_GET
:
case
BUF_GET_IF_IN_POOL
:
case
BUF_PEEK_IF_IN_POOL
:
break
;
default:
ut_error
;
}
#endif
/* UNIV_DEBUG */
ut_ad
(
zip_size
==
fil_space_get_zip_size
(
space
));
ut_ad
(
ut_is_2pow
(
zip_size
));
#ifndef UNIV_LOG_DEBUG
...
...
@@ -2088,7 +2101,8 @@ buf_page_get_gen(
buf_pool_mutex_exit
();
if
(
mode
==
BUF_GET_IF_IN_POOL
)
{
if
(
mode
==
BUF_GET_IF_IN_POOL
||
mode
==
BUF_PEEK_IF_IN_POOL
)
{
return
(
NULL
);
}
...
...
@@ -2127,7 +2141,8 @@ buf_page_get_gen(
must_read
=
buf_block_get_io_fix
(
block
)
==
BUF_IO_READ
;
if
(
must_read
&&
mode
==
BUF_GET_IF_IN_POOL
)
{
if
(
must_read
&&
(
mode
==
BUF_GET_IF_IN_POOL
||
mode
==
BUF_PEEK_IF_IN_POOL
))
{
/* The page is only being read to buffer */
buf_pool_mutex_exit
();
...
...
@@ -2245,6 +2260,7 @@ buf_page_get_gen(
mutex_exit
(
&
buf_pool_zip_mutex
);
buf_pool
->
n_pend_unzip
++
;
bpage
->
state
=
BUF_BLOCK_ZIP_FREE
;
buf_buddy_free
(
bpage
,
sizeof
*
bpage
);
buf_pool_mutex_exit
();
...
...
@@ -2321,7 +2337,9 @@ buf_page_get_gen(
buf_pool_mutex_exit
();
buf_page_set_accessed_make_young
(
&
block
->
page
,
access_time
);
if
(
UNIV_LIKELY
(
mode
!=
BUF_PEEK_IF_IN_POOL
))
{
buf_page_set_accessed_make_young
(
&
block
->
page
,
access_time
);
}
#if defined UNIV_DEBUG_FILE_ACCESSES || defined UNIV_DEBUG
ut_a
(
!
block
->
page
.
file_page_was_freed
);
...
...
@@ -2374,7 +2392,7 @@ buf_page_get_gen(
mtr_memo_push
(
mtr
,
block
,
fix_type
);
if
(
!
access_time
)
{
if
(
UNIV_LIKELY
(
mode
!=
BUF_PEEK_IF_IN_POOL
)
&&
!
access_time
)
{
/* In the case of a first access, try to apply linear
read-ahead */
...
...
@@ -2923,6 +2941,7 @@ buf_page_init_for_read(
&&
UNIV_LIKELY_NULL
(
buf_page_hash_get
(
space
,
offset
)))
{
/* The block was added by some other thread. */
bpage
->
state
=
BUF_BLOCK_ZIP_FREE
;
buf_buddy_free
(
bpage
,
sizeof
*
bpage
);
buf_buddy_free
(
data
,
zip_size
);
...
...
storage/innodb_plugin/buf/buf0lru.c
View file @
d2d7aa48
...
...
@@ -246,71 +246,75 @@ buf_LRU_drop_page_hash_for_tablespace(
page_arr
=
ut_malloc
(
sizeof
(
ulint
)
*
BUF_LRU_DROP_SEARCH_HASH_SIZE
);
buf_pool_mutex_enter
();
num_entries
=
0
;
scan_again:
num_entries
=
0
;
bpage
=
UT_LIST_GET_LAST
(
buf_pool
->
LRU
);
while
(
bpage
!=
NULL
)
{
mutex_t
*
block_mutex
=
buf_page_get_mutex
(
bpage
);
buf_page_t
*
prev_bpage
;
ibool
is_fixed
;
mutex_enter
(
block_mutex
);
prev_bpage
=
UT_LIST_GET_PREV
(
LRU
,
bpage
);
ut_a
(
buf_page_in_file
(
bpage
));
if
(
buf_page_get_state
(
bpage
)
!=
BUF_BLOCK_FILE_PAGE
||
bpage
->
space
!=
id
||
bpage
->
buf_fix_count
>
0
||
bpage
->
io_fix
!=
BUF_IO_NONE
)
{
/* We leave the fixed pages as is in this scan.
To be dealt with later in the final scan. */
mutex_exit
(
block_mutex
);
goto
next_page
;
/* Compressed pages are never hashed.
Skip blocks of other tablespaces.
Skip I/O-fixed blocks (to be dealt with later). */
next_page:
bpage
=
prev_bpage
;
continue
;
}
if
(((
buf_block_t
*
)
bpage
)
->
is_hashed
)
{
mutex_enter
(
&
((
buf_block_t
*
)
bpage
)
->
mutex
);
is_fixed
=
bpage
->
buf_fix_count
>
0
||
!
((
buf_block_t
*
)
bpage
)
->
is_hashed
;
mutex_exit
(
&
((
buf_block_t
*
)
bpage
)
->
mutex
);
/* Store the offset(i.e.: page_no) in the array
so that we can drop hash index in a batch
later. */
page_arr
[
num_entries
]
=
bpage
->
offset
;
mutex_exit
(
block_mutex
);
ut_a
(
num_entries
<
BUF_LRU_DROP_SEARCH_HASH_SIZE
);
++
num_entries
;
if
(
is_fixed
)
{
goto
next_page
;
}
if
(
num_entries
<
BUF_LRU_DROP_SEARCH_HASH_SIZE
)
{
goto
next_page
;
}
/* Array full. We release the buf_pool_mutex to
obey the latching order. */
buf_pool_mutex_exit
();
buf_LRU_drop_page_hash_batch
(
id
,
zip_size
,
page_arr
,
num_entries
);
num_entries
=
0
;
buf_pool_mutex_enter
();
}
else
{
mutex_exit
(
block_mutex
);
/* Store the page number so that we can drop the hash
index in a batch later. */
page_arr
[
num_entries
]
=
bpage
->
offset
;
ut_a
(
num_entries
<
BUF_LRU_DROP_SEARCH_HASH_SIZE
);
++
num_entries
;
if
(
num_entries
<
BUF_LRU_DROP_SEARCH_HASH_SIZE
)
{
goto
next_page
;
}
next_page:
/* Note that we may have released the buf_pool mutex
above after reading the prev_bpage during processing
of a page_hash_batch (i.e.: when the array was full).
This means that prev_bpage can change in LRU list.
This is OK because this function is a 'best effort'
to drop as many search hash entries as possible and
it does not guarantee that ALL such entries will be
dropped. */
bpage
=
prev_bpage
;
/* Array full. We release the buf_pool_mutex to
obey the latching order. */
buf_pool_mutex_exit
();
buf_LRU_drop_page_hash_batch
(
id
,
zip_size
,
page_arr
,
num_entries
);
buf_pool_mutex_enter
();
num_entries
=
0
;
/* Note that we released the buf_pool mutex above
after reading the prev_bpage during processing of a
page_hash_batch (i.e.: when the array was full).
Because prev_bpage could belong to a compressed-only
block, it may have been relocated, and thus the
pointer cannot be trusted. Because bpage is of type
buf_block_t, it is safe to dereference.
bpage can change in the LRU list. This is OK because
this function is a 'best effort' to drop as many
search hash entries as possible and it does not
guarantee that ALL such entries will be dropped. */
/* If, however, bpage has been removed from LRU list
to the free list then we should restart the scan.
bpage->state is protected by buf_pool mutex. */
if
(
bpage
&&
!
buf_page_in_file
(
bpage
))
{
ut_a
(
num_entries
==
0
);
if
(
bpage
&&
buf_page_get_state
(
bpage
)
!=
BUF_BLOCK_FILE_PAGE
)
{
goto
scan_again
;
}
}
...
...
@@ -1799,6 +1803,7 @@ buf_LRU_block_remove_hashed_page(
buf_pool_mutex_exit_forbid
();
buf_buddy_free
(
bpage
->
zip
.
data
,
page_zip_get_size
(
&
bpage
->
zip
));
bpage
->
state
=
BUF_BLOCK_ZIP_FREE
;
buf_buddy_free
(
bpage
,
sizeof
(
*
bpage
));
buf_pool_mutex_exit_allow
();
UNIV_MEM_UNDESC
(
bpage
);
...
...
storage/innodb_plugin/include/buf0buf.h
View file @
d2d7aa48
...
...
@@ -41,6 +41,8 @@ Created 11/5/1995 Heikki Tuuri
/* @{ */
#define BUF_GET 10
/*!< get always */
#define BUF_GET_IF_IN_POOL 11
/*!< get if in pool */
#define BUF_PEEK_IF_IN_POOL 12
/*!< get if in pool, do not make
the block young in the LRU list */
#define BUF_GET_NO_LATCH 14
/*!< get and bufferfix, but
set no latch; we have
separated this case, because
...
...
@@ -284,7 +286,7 @@ buf_page_get_gen(
ulint
rw_latch
,
/*!< in: RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */
buf_block_t
*
guess
,
/*!< in: guessed block or NULL */
ulint
mode
,
/*!< in: BUF_GET, BUF_GET_IF_IN_POOL,
BUF_GET_NO_LATCH */
BUF_
PEEK_IF_IN_POOL, BUF_
GET_NO_LATCH */
const
char
*
file
,
/*!< in: file name */
ulint
line
,
/*!< in: line where called */
mtr_t
*
mtr
);
/*!< in: mini-transaction */
...
...
storage/innodb_plugin/include/sync0arr.h
View file @
d2d7aa48
...
...
@@ -115,8 +115,11 @@ Prints warnings of long semaphore waits to stderr.
@return TRUE if fatal semaphore wait threshold was exceeded */
UNIV_INTERN
ibool
sync_array_print_long_waits
(
void
);
/*=============================*/
sync_array_print_long_waits
(
/*========================*/
os_thread_id_t
*
waiter
,
/*!< out: longest waiting thread */
const
void
**
sema
)
/*!< out: longest-waited-for semaphore */
__attribute__
((
nonnull
));
/********************************************************************//**
Validates the integrity of the wait array. Checks
that the number of reserved cells equals the count variable. */
...
...
storage/innodb_plugin/page/page0zip.c
View file @
d2d7aa48
...
...
@@ -653,13 +653,13 @@ page_zip_dir_encode(
Allocate memory for zlib. */
static
void
*
page_zip_
m
alloc
(
page_zip_
z
alloc
(
/*============*/
void
*
opaque
,
/*!< in/out: memory heap */
uInt
items
,
/*!< in: number of items to allocate */
uInt
size
)
/*!< in: size of an item in bytes */
{
return
(
mem_heap_alloc
(
opaque
,
items
*
size
));
return
(
mem_heap_
z
alloc
(
opaque
,
items
*
size
));
}
/**********************************************************************//**
...
...
@@ -684,7 +684,7 @@ page_zip_set_alloc(
{
z_stream
*
strm
=
stream
;
strm
->
zalloc
=
page_zip_
m
alloc
;
strm
->
zalloc
=
page_zip_
z
alloc
;
strm
->
zfree
=
page_zip_free
;
strm
->
opaque
=
heap
;
}
...
...
@@ -2912,19 +2912,18 @@ page_zip_decompress(
page_zip_set_alloc
(
&
d_stream
,
heap
);
if
(
UNIV_UNLIKELY
(
inflateInit2
(
&
d_stream
,
UNIV_PAGE_SIZE_SHIFT
)
!=
Z_OK
))
{
ut_error
;
}
d_stream
.
next_in
=
page_zip
->
data
+
PAGE_DATA
;
/* Subtract the space reserved for
the page header and the end marker of the modification log. */
d_stream
.
avail_in
=
page_zip_get_size
(
page_zip
)
-
(
PAGE_DATA
+
1
);
d_stream
.
next_out
=
page
+
PAGE_ZIP_START
;
d_stream
.
avail_out
=
UNIV_PAGE_SIZE
-
PAGE_ZIP_START
;
if
(
UNIV_UNLIKELY
(
inflateInit2
(
&
d_stream
,
UNIV_PAGE_SIZE_SHIFT
)
!=
Z_OK
))
{
ut_error
;
}
/* Decode the zlib header and the index information. */
if
(
UNIV_UNLIKELY
(
inflate
(
&
d_stream
,
Z_BLOCK
)
!=
Z_OK
))
{
...
...
storage/innodb_plugin/srv/srv0srv.c
View file @
d2d7aa48
...
...
@@ -2236,6 +2236,12 @@ srv_error_monitor_thread(
ulint
fatal_cnt
=
0
;
ib_uint64_t
old_lsn
;
ib_uint64_t
new_lsn
;
/* longest waiting thread for a semaphore */
os_thread_id_t
waiter
=
os_thread_get_curr_id
();
os_thread_id_t
old_waiter
=
waiter
;
/* the semaphore that is being waited for */
const
void
*
sema
=
NULL
;
const
void
*
old_sema
=
NULL
;
old_lsn
=
srv_start_lsn
;
...
...
@@ -2284,7 +2290,8 @@ srv_error_monitor_thread(
sync_arr_wake_threads_if_sema_free
();
if
(
sync_array_print_long_waits
())
{
if
(
sync_array_print_long_waits
(
&
waiter
,
&
sema
)
&&
sema
==
old_sema
&&
os_thread_eq
(
waiter
,
old_waiter
))
{
fatal_cnt
++
;
if
(
fatal_cnt
>
10
)
{
...
...
@@ -2299,6 +2306,8 @@ srv_error_monitor_thread(
}
}
else
{
fatal_cnt
=
0
;
old_waiter
=
waiter
;
old_sema
=
sema
;
}
/* Flush stderr so that a database user gets the output
...
...
storage/innodb_plugin/sync/sync0arr.c
View file @
d2d7aa48
...
...
@@ -914,8 +914,10 @@ Prints warnings of long semaphore waits to stderr.
@return TRUE if fatal semaphore wait threshold was exceeded */
UNIV_INTERN
ibool
sync_array_print_long_waits
(
void
)
/*=============================*/
sync_array_print_long_waits
(
/*========================*/
os_thread_id_t
*
waiter
,
/*!< out: longest waiting thread */
const
void
**
sema
)
/*!< out: longest-waited-for semaphore */
{
sync_cell_t
*
cell
;
ibool
old_val
;
...
...
@@ -923,24 +925,40 @@ sync_array_print_long_waits(void)
ulint
i
;
ulint
fatal_timeout
=
srv_fatal_semaphore_wait_threshold
;
ibool
fatal
=
FALSE
;
double
longest_diff
=
0
;
for
(
i
=
0
;
i
<
sync_primary_wait_array
->
n_cells
;
i
++
)
{
double
diff
;
void
*
wait_object
;
cell
=
sync_array_get_nth_cell
(
sync_primary_wait_array
,
i
);
if
(
cell
->
wait_object
!=
NULL
&&
cell
->
waiting
&&
difftime
(
time
(
NULL
),
cell
->
reservation_time
)
>
240
)
{
wait_object
=
cell
->
wait_object
;
if
(
wait_object
==
NULL
||
!
cell
->
waiting
)
{
continue
;
}
diff
=
difftime
(
time
(
NULL
),
cell
->
reservation_time
);
if
(
diff
>
240
)
{
fputs
(
"InnoDB: Warning: a long semaphore wait:
\n
"
,
stderr
);
sync_array_cell_print
(
stderr
,
cell
);
noticed
=
TRUE
;
}
if
(
cell
->
wait_object
!=
NULL
&&
cell
->
waiting
&&
difftime
(
time
(
NULL
),
cell
->
reservation_time
)
>
fatal_timeout
)
{
if
(
diff
>
fatal_timeout
)
{
fatal
=
TRUE
;
}
if
(
diff
>
longest_diff
)
{
longest_diff
=
diff
;
*
sema
=
wait_object
;
*
waiter
=
cell
->
thread
;
}
}
if
(
noticed
)
{
...
...
storage/innodb_plugin/trx/trx0i_s.c
View file @
d2d7aa48
...
...
@@ -508,7 +508,7 @@ fill_trx_row(
query
[
stmt_len
]
=
'\0'
;
row
->
trx_query
=
ha_storage_put_memlim
(
cache
->
storage
,
stmt
,
stmt_len
+
1
,
cache
->
storage
,
query
,
stmt_len
+
1
,
MAX_ALLOWED_FOR_STORAGE
(
cache
));
row
->
trx_query_cs
=
innobase_get_charset
(
trx
->
mysql_thd
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment