Merge lp:~laurynas-biveinis/percona-server/lru-manager into lp:percona-server/5.6

Proposed by Laurynas Biveinis
Status: Merged
Approved by: Stewart Smith
Approved revision: no longer in the source branch.
Merged at revision: 521
Proposed branch: lp:~laurynas-biveinis/percona-server/lru-manager
Merge into: lp:percona-server/5.6
Diff against target: 374 lines (+134/-27)
8 files modified
Percona-Server/mysql-test/suite/perfschema/r/threads_innodb.result (+1/-0)
Percona-Server/storage/innobase/buf/buf0flu.cc (+77/-12)
Percona-Server/storage/innobase/buf/buf0lru.cc (+8/-6)
Percona-Server/storage/innobase/handler/ha_innodb.cc (+23/-6)
Percona-Server/storage/innobase/include/buf0flu.h (+15/-1)
Percona-Server/storage/innobase/include/srv0srv.h (+5/-1)
Percona-Server/storage/innobase/srv/srv0srv.cc (+4/-1)
Percona-Server/storage/innobase/srv/srv0start.cc (+1/-0)
To merge this branch: bzr merge lp:~laurynas-biveinis/percona-server/lru-manager
Reviewer Review Type Date Requested Status
Stewart Smith (community) Approve
Vlad Lesin (community) g2 Approve
Review via email: mp+192321@code.launchpad.net

Description of the change

http://jenkins.percona.com/job/percona-server-5.6-param/392/

    Split an LRU manager thread out of the page cleaner thread,
    implementing
    https://blueprints.launchpad.net/percona-server/+spec/lru-manager-thread.

    Declare new thread entry point buf_lru_manager_thread(). Move LRU
    flushing-related code from buf_flush_page_cleaner_thread(). Spawn
    this thread from innobase_start_or_create_for_mysql().

    Revert the change that was needed by
    https://blueprints.launchpad.net/percona-server/+spec/xtradb-empty-free-list-backoff
    in buf_flush_ready_for_flush() and allow flush list flushing of
    latched pages again.

    Introduce a new flag buf_lru_manager_is_active that is used instead of
    buf_page_cleaner_is_active by buf_LRU_get_free_block().

    Adjust innodb_sched_priority_cleaner_update() to set the priority for
    both cleaner and LRU manager threads.

    Define a PFS key for the new thread. Re-record
    perfschema.threads_innodb testcase.

To post a comment you must log in.
Revision history for this message
Vlad Lesin (vlad-lesin) wrote :

1) Lines 33,34: Why do we need this?

2) buf_flush_wait_LRU_batch_end() call in buf_flush_page_cleaner_thread():
Actually buf_flush_LRU_tail() waits for batch LRU end. Do we really need to invoke buf_flush_wait_LRU_batch_end() from buf_flush_page_cleaner_thread()?

3) buf_flush_LRU_tail():
Interestingly how often
do {
...
} while (active_instance[i]
         && free_len <= free_list_lwm);
loop is repeated for each buffer pool instance? If not so often then replacing the order of buf_flush_LRU() and buf_flush_wait_batch_end() call would allow us to avoid waiting for LRU batch flushing for the current buffer pool instance. I mean we could invoke buf_flush_wait_batch_end() before buf_flush_LRU() to follow the restriction "one LRU batch per one buffer pool instance" from one hand and to have possibility to launch batch LRU flushing for other buffer pool instances not waiting the end of the current buffer pool instance batch flushing from another hand.

Revision history for this message
Laurynas Biveinis (laurynas-biveinis) wrote :

Vlad -

> 1) Lines 33,34: Why do we need this?

They implement this bit from the commit message:

    Revert the change that was needed by
    https://blueprints.launchpad.net/percona-server/+spec/xtradb-empty-free-list-backoff
    in buf_flush_ready_for_flush() and allow flush list flushing of
    latched pages again.

> 2) buf_flush_wait_LRU_batch_end() call in buf_flush_page_cleaner_thread():
> Actually buf_flush_LRU_tail() waits for batch LRU end. Do we really need to
> invoke buf_flush_wait_LRU_batch_end() from
> buf_flush_page_cleaner_thread()?

An LRU flush not by buf_flush_LRU_tail() but by a query thread is
possible if running with --innodb_empty_free_list_algorithm=legacy.

> 3) buf_flush_LRU_tail():
> Interestingly how often
> do {
> ...
> } while (active_instance[i]
> && free_len <= free_list_lwm);
> loop is repeated for each buffer pool instance?

Alexey Stroganov should have a detailed answer for this :)

> If not so often then replacing
> the order of buf_flush_LRU() and buf_flush_wait_batch_end() call would allow
> us to avoid waiting for LRU batch flushing for the current buffer pool
> instance. I mean we could invoke buf_flush_wait_batch_end() before
> buf_flush_LRU() to follow the restriction "one LRU batch per one buffer pool
> instance" from one hand and to have possibility to launch batch LRU flushing
> for other buffer pool instances not waiting the end of the current buffer pool
> instance batch flushing from another hand.

I am not sure I understand: if we swap buf_flush_LRU() with
buf_flush_wait_batch_end(), how does that give the possibility to
start batches for other instances? buf_flush_wait_batch_end() will
block on the current instance.

Revision history for this message
Vlad Lesin (vlad-lesin) wrote :

Thank you for the previous answers, they helped me to dispell doubts about some parts of the code.

> > If not so often then replacing
> > the order of buf_flush_LRU() and buf_flush_wait_batch_end() call would allow
> > us to avoid waiting for LRU batch flushing for the current buffer pool
> > instance. I mean we could invoke buf_flush_wait_batch_end() before
> > buf_flush_LRU() to follow the restriction "one LRU batch per one buffer pool
> > instance" from one hand and to have possibility to launch batch LRU flushing
> > for other buffer pool instances not waiting the end of the current buffer
> pool
> > instance batch flushing from another hand.
>
> I am not sure I understand: if we swap buf_flush_LRU() with
> buf_flush_wait_batch_end(), how does that give the possibility to
> start batches for other instances? buf_flush_wait_batch_end() will
> block on the current instance.

Yes, but we could check for example buf_pool->n_flush before invoking buf_flush_wait_batch_end() to avoid blocking if there are not pending flushes for the current buffer pool instance.

The current algorithm is the following:
for (ulint i = 0; i < srv_buf_pool_instances; i++) {
  ...
  do {
    ...
    buf_flush_LRU(i-th buffer-pool instance);
    buf_flush_wait_batch_end(i-th buffer-pool instance);
    ...
  } while (...)
}

So buf_flush_wait_batch_end() will block execution until flush io for the current buffer pool instance is finished. And in the case when the count of "do {} while()" loops is generally small this buf_flush_wait_batch_end() call prevent processing the next buffer pool instance until the current buffer pool instance flush io's is finished. The idea is to swap these two calls like the following:

for (ulint i = 0; i < srv_buf_pool_instances; i++) {
  ...
  do {
    ...
    if (buf_pool->n_flush[...])
        buf_flush_wait_batch_end(i-th buffer-pool instance);
    buf_flush_LRU(i-th buffer-pool instance);
    ...
  } while (...)
}

In this case we don't wait for flush ending for the current buffer pool instance and begin processing the next buffer pool instance while the current buffer pool instance flushing is still in progress.

So I am not completely sure about this idea as I did not dig the code deep enough in this direction. Just want to share and discuss it.

review: Approve (g2)
Revision history for this message
Laurynas Biveinis (laurynas-biveinis) wrote :

Vlad -

> for (ulint i = 0; i < srv_buf_pool_instances; i++) {
> ...
> do {
> ...
> if (buf_pool->n_flush[...])
> buf_flush_wait_batch_end(i-th buffer-pool instance);
> buf_flush_LRU(i-th buffer-pool instance);
> ...
> } while (...)
> }

I think I understand now. Yes, it seems it would block less. I think we had tried something similar that was supposed to block less during prototyping and IIRC it just didn't help, although I cannot remember why.

We can submit a follow-up MP once/if this is analyzed and improvements are designed and implemented.

Revision history for this message
Stewart Smith (stewart) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'Percona-Server/mysql-test/suite/perfschema/r/threads_innodb.result'
2--- Percona-Server/mysql-test/suite/perfschema/r/threads_innodb.result 2012-02-15 02:19:04 +0000
3+++ Percona-Server/mysql-test/suite/perfschema/r/threads_innodb.result 2013-10-23 12:17:08 +0000
4@@ -6,6 +6,7 @@
5 GROUP BY name;
6 name type processlist_user processlist_host processlist_db processlist_command processlist_time processlist_state processlist_info parent_thread_id role instrumented
7 thread/innodb/io_handler_thread BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES
8+thread/innodb/lru_manager_thread BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES
9 thread/innodb/page_cleaner_thread BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES
10 thread/innodb/srv_error_monitor_thread BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES
11 thread/innodb/srv_lock_timeout_thread BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES
12
13=== modified file 'Percona-Server/storage/innobase/buf/buf0flu.cc'
14--- Percona-Server/storage/innobase/buf/buf0flu.cc 2013-10-23 08:48:28 +0000
15+++ Percona-Server/storage/innobase/buf/buf0flu.cc 2013-10-23 12:17:08 +0000
16@@ -59,8 +59,12 @@
17 doing the shutdown */
18 UNIV_INTERN ibool buf_page_cleaner_is_active = FALSE;
19
20+/** Flag indicating if the lru_manager is in active state. */
21+UNIV_INTERN bool buf_lru_manager_is_active = false;
22+
23 #ifdef UNIV_PFS_THREAD
24 UNIV_INTERN mysql_pfs_key_t buf_page_cleaner_thread_key;
25+UNIV_INTERN mysql_pfs_key_t buf_lru_manager_thread_key;
26 #endif /* UNIV_PFS_THREAD */
27
28 /** If LRU list of a buf_pool is less than this size then LRU eviction
29@@ -550,6 +554,8 @@
30
31 switch (flush_type) {
32 case BUF_FLUSH_LIST:
33+ return(true);
34+
35 case BUF_FLUSH_LRU:
36 case BUF_FLUSH_SINGLE_PAGE:
37 /* Because any thread may call single page flush, even
38@@ -2626,7 +2632,7 @@
39
40 /******************************************************************//**
41 page_cleaner thread tasked with flushing dirty pages from the buffer
42-pools. As of now we'll have only one instance of this thread.
43+pool flush lists. As of now we'll have only one instance of this thread.
44 @return a dummy parameter */
45 extern "C" UNIV_INTERN
46 os_thread_ret_t
47@@ -2639,7 +2645,6 @@
48 ulint next_loop_time = ut_time_ms() + 1000;
49 ulint n_flushed = 0;
50 ulint last_activity = srv_get_activity_count();
51- ulint lru_sleep_time = srv_cleaner_max_lru_time;
52
53 ut_ad(!srv_read_only_mode);
54
55@@ -2660,7 +2665,6 @@
56
57 while (srv_shutdown_state == SRV_SHUTDOWN_NONE) {
58
59- ulint flush_sleep_time;
60 ulint page_cleaner_sleep_time;
61
62 srv_current_thread_priority = srv_cleaner_thread_priority;
63@@ -2674,18 +2678,11 @@
64 page_cleaner_sleep_if_needed(next_loop_time);
65 }
66
67- page_cleaner_adapt_lru_sleep_time(&lru_sleep_time);
68-
69- flush_sleep_time = page_cleaner_adapt_flush_sleep_time();
70-
71- page_cleaner_sleep_time = ut_min(lru_sleep_time,
72- flush_sleep_time);
73+ page_cleaner_sleep_time
74+ = page_cleaner_adapt_flush_sleep_time();
75
76 next_loop_time = ut_time_ms() + page_cleaner_sleep_time;
77
78- /* Flush pages from end of LRU if required */
79- n_flushed = buf_flush_LRU_tail();
80-
81 if (srv_check_activity(last_activity)) {
82 last_activity = srv_get_activity_count();
83
84@@ -2778,6 +2775,74 @@
85 OS_THREAD_DUMMY_RETURN;
86 }
87
88+/******************************************************************//**
89+lru_manager thread tasked with performing LRU flushes and evictions to refill
90+the buffer pool free lists. As of now we'll have only one instance of this
91+thread.
92+@return a dummy parameter */
93+extern "C" UNIV_INTERN
94+os_thread_ret_t
95+DECLARE_THREAD(buf_flush_lru_manager_thread)(
96+/*==========================================*/
97+ void* arg __attribute__((unused)))
98+ /*!< in: a dummy parameter required by
99+ os_thread_create */
100+{
101+ ulint next_loop_time = ut_time_ms() + 1000;
102+ ulint lru_sleep_time = srv_cleaner_max_lru_time;
103+
104+#ifdef UNIV_PFS_THREAD
105+ pfs_register_thread(buf_lru_manager_thread_key);
106+#endif /* UNIV_PFS_THREAD */
107+
108+ srv_lru_manager_tid = os_thread_get_tid();
109+
110+ os_thread_set_priority(srv_lru_manager_tid,
111+ srv_sched_priority_cleaner);
112+
113+#ifdef UNIV_DEBUG_THREAD_CREATION
114+ fprintf(stderr, "InnoDB: lru_manager thread running, id %lu\n",
115+ os_thread_pf(os_thread_get_curr_id()));
116+#endif /* UNIV_DEBUG_THREAD_CREATION */
117+
118+ buf_lru_manager_is_active = true;
119+
120+ /* On server shutdown, the LRU manager thread runs through cleanup
121+ phase to provide free pages for the master and purge threads. */
122+ while (srv_shutdown_state == SRV_SHUTDOWN_NONE
123+ || srv_shutdown_state == SRV_SHUTDOWN_CLEANUP) {
124+
125+ ulint n_flushed_lru;
126+
127+ srv_current_thread_priority = srv_cleaner_thread_priority;
128+
129+ page_cleaner_sleep_if_needed(next_loop_time);
130+
131+ page_cleaner_adapt_lru_sleep_time(&lru_sleep_time);
132+
133+ next_loop_time = ut_time_ms() + lru_sleep_time;
134+
135+ n_flushed_lru = buf_flush_LRU_tail();
136+
137+ if (n_flushed_lru) {
138+
139+ MONITOR_INC_VALUE_CUMULATIVE(
140+ MONITOR_FLUSH_BACKGROUND_TOTAL_PAGE,
141+ MONITOR_FLUSH_BACKGROUND_COUNT,
142+ MONITOR_FLUSH_BACKGROUND_PAGES,
143+ n_flushed_lru);
144+ }
145+ }
146+
147+ buf_lru_manager_is_active = false;
148+
149+ /* We count the number of threads in os_thread_exit(). A created
150+ thread should always use that to exit and not use return() to exit. */
151+ os_thread_exit(NULL);
152+
153+ OS_THREAD_DUMMY_RETURN;
154+}
155+
156 #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
157
158 /** Functor to validate the flush list. */
159
160=== modified file 'Percona-Server/storage/innobase/buf/buf0lru.cc'
161--- Percona-Server/storage/innobase/buf/buf0lru.cc 2013-10-23 08:48:28 +0000
162+++ Percona-Server/storage/innobase/buf/buf0lru.cc 2013-10-23 12:17:08 +0000
163@@ -1365,8 +1365,9 @@
164 }
165
166 if (srv_empty_free_list_algorithm == SRV_EMPTY_FREE_LIST_BACKOFF
167- && buf_page_cleaner_is_active
168- && srv_shutdown_state == SRV_SHUTDOWN_NONE) {
169+ && buf_lru_manager_is_active
170+ && (srv_shutdown_state == SRV_SHUTDOWN_NONE
171+ || srv_shutdown_state == SRV_SHUTDOWN_CLEANUP)) {
172
173 /* Backoff to minimize the free list mutex contention while the
174 free list is empty */
175@@ -1408,12 +1409,13 @@
176 goto loop;
177 } else {
178
179- /* The cleaner is not running or Oracle MySQL 5.6 algorithm was
180- requested, will perform a single page flush */
181+ /* The LRU manager is not running or Oracle MySQL 5.6 algorithm
182+ was requested, will perform a single page flush */
183 ut_ad((srv_empty_free_list_algorithm
184 == SRV_EMPTY_FREE_LIST_LEGACY)
185- || !buf_page_cleaner_is_active
186- || (srv_shutdown_state != SRV_SHUTDOWN_NONE));
187+ || !buf_lru_manager_is_active
188+ || (srv_shutdown_state != SRV_SHUTDOWN_NONE
189+ && srv_shutdown_state != SRV_SHUTDOWN_CLEANUP));
190 }
191
192 mutex_enter(&buf_pool->flush_state_mutex);
193
194=== modified file 'Percona-Server/storage/innobase/handler/ha_innodb.cc'
195--- Percona-Server/storage/innobase/handler/ha_innodb.cc 2013-10-23 08:48:28 +0000
196+++ Percona-Server/storage/innobase/handler/ha_innodb.cc 2013-10-23 12:17:08 +0000
197@@ -457,6 +457,7 @@
198 {&srv_master_thread_key, "srv_master_thread", 0},
199 {&srv_purge_thread_key, "srv_purge_thread", 0},
200 {&buf_page_cleaner_thread_key, "page_cleaner_thread", 0},
201+ {&buf_lru_manager_thread_key, "lru_manager_thread", 0},
202 {&recv_writer_thread_key, "recv_writer_thread", 0},
203 {&srv_log_tracking_thread_key, "srv_redo_log_follow_thread", 0}
204 };
205@@ -15847,7 +15848,7 @@
206
207 /****************************************************************//**
208 Update the innodb_sched_priority_cleaner variable and set the thread
209-priority accordingly. */
210+priorities accordingly. */
211 static
212 void
213 innodb_sched_priority_cleaner_update(
214@@ -15863,6 +15864,24 @@
215 ulint priority = *static_cast<const ulint *>(save);
216 ulint actual_priority;
217
218+ /* Set the priority for the LRU manager thread */
219+ ut_ad(buf_lru_manager_is_active);
220+ actual_priority = os_thread_set_priority(srv_lru_manager_tid,
221+ priority);
222+ if (UNIV_UNLIKELY(actual_priority != priority)) {
223+
224+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
225+ ER_WRONG_ARGUMENTS,
226+ "Failed to set the LRU manager thread "
227+ "priority to %lu, "
228+ "the current priority is %lu", priority,
229+ actual_priority);
230+ } else {
231+
232+ srv_sched_priority_cleaner = priority;
233+ }
234+
235+ /* Set the priority for the page cleaner thread */
236 if (srv_read_only_mode) {
237
238 return;
239@@ -15878,9 +15897,6 @@
240 "priority to %lu, "
241 "the current priority is %lu", priority,
242 actual_priority);
243- } else {
244-
245- srv_sched_priority_cleaner = priority;
246 }
247 }
248
249@@ -16874,7 +16890,7 @@
250
251 static MYSQL_SYSVAR_ULONG(sched_priority_cleaner, srv_sched_priority_cleaner,
252 PLUGIN_VAR_RQCMDARG,
253- "Nice value for the cleaner thread scheduling",
254+ "Nice value for the cleaner and LRU manager thread scheduling",
255 NULL, innodb_sched_priority_cleaner_update, 19, 0, 39, 0);
256
257 #endif /* UNIV_LINUX */
258@@ -16919,7 +16935,8 @@
259
260 static MYSQL_SYSVAR_BOOL(priority_cleaner, srv_cleaner_thread_priority,
261 PLUGIN_VAR_OPCMDARG,
262- "Make buffer pool cleaner thread acquire shared resources with priority",
263+ "Make buffer pool cleaner and LRU manager threads acquire shared resources "
264+ "with priority",
265 NULL, NULL, FALSE);
266
267 static MYSQL_SYSVAR_BOOL(priority_master, srv_master_thread_priority,
268
269=== modified file 'Percona-Server/storage/innobase/include/buf0flu.h'
270--- Percona-Server/storage/innobase/include/buf0flu.h 2013-10-23 08:48:28 +0000
271+++ Percona-Server/storage/innobase/include/buf0flu.h 2013-10-23 12:17:08 +0000
272@@ -36,6 +36,9 @@
273 /** Flag indicating if the page_cleaner is in active state. */
274 extern ibool buf_page_cleaner_is_active;
275
276+/** Flag indicating if the lru_manager is in active state. */
277+extern bool buf_lru_manager_is_active;
278+
279 /********************************************************************//**
280 Remove a block from the flush list of modified blocks. */
281 UNIV_INTERN
282@@ -175,7 +178,7 @@
283 buf_page_in_file(bpage) and in the LRU list */
284 /******************************************************************//**
285 page_cleaner thread tasked with flushing dirty pages from the buffer
286-pools. As of now we'll have only one instance of this thread.
287+pool flush lists. As of now we'll have only one instance of this thread.
288 @return a dummy parameter */
289 extern "C" UNIV_INTERN
290 os_thread_ret_t
291@@ -183,6 +186,17 @@
292 /*==========================================*/
293 void* arg); /*!< in: a dummy parameter required by
294 os_thread_create */
295+/******************************************************************//**
296+lru_manager thread tasked with performing LRU flushes and evictions to refill
297+the buffer pool free lists. As of now we'll have only one instance of this
298+thread.
299+@return a dummy parameter */
300+extern "C" UNIV_INTERN
301+os_thread_ret_t
302+DECLARE_THREAD(buf_flush_lru_manager_thread)(
303+/*=========================================*/
304+ void* arg); /*!< in: a dummy parameter required by
305+ os_thread_create */
306 /*********************************************************************//**
307 Clears up tail of the LRU lists:
308 * Put replaceable pages at the tail of LRU to the free list
309
310=== modified file 'Percona-Server/storage/innobase/include/srv0srv.h'
311--- Percona-Server/storage/innobase/include/srv0srv.h 2013-10-23 08:48:28 +0000
312+++ Percona-Server/storage/innobase/include/srv0srv.h 2013-10-23 12:17:08 +0000
313@@ -525,6 +525,9 @@
314 /* The tid of the cleaner thread */
315 extern os_tid_t srv_cleaner_tid;
316
317+/* The tid of the LRU manager thread */
318+extern os_tid_t srv_lru_manager_tid;
319+
320 /* The tids of the purge threads */
321 extern os_tid_t srv_purge_tids[];
322
323@@ -534,7 +537,7 @@
324 /* The tid of the master thread */
325 extern os_tid_t srv_master_tid;
326
327-/* The relative scheduling priority of the cleaner thread */
328+/* The relative scheduling priority of the cleaner and LRU manager threads */
329 extern ulint srv_sched_priority_cleaner;
330
331 /* The relative scheduling priority of the purge threads */
332@@ -586,6 +589,7 @@
333 # ifdef UNIV_PFS_THREAD
334 /* Keys to register InnoDB threads with performance schema */
335 extern mysql_pfs_key_t buf_page_cleaner_thread_key;
336+extern mysql_pfs_key_t buf_lru_manager_thread_key;
337 extern mysql_pfs_key_t trx_rollback_clean_thread_key;
338 extern mysql_pfs_key_t io_handler_thread_key;
339 extern mysql_pfs_key_t srv_lock_timeout_thread_key;
340
341=== modified file 'Percona-Server/storage/innobase/srv/srv0srv.cc'
342--- Percona-Server/storage/innobase/srv/srv0srv.cc 2013-10-23 08:48:28 +0000
343+++ Percona-Server/storage/innobase/srv/srv0srv.cc 2013-10-23 12:17:08 +0000
344@@ -359,6 +359,9 @@
345 /* The tid of the cleaner thread */
346 UNIV_INTERN os_tid_t srv_cleaner_tid;
347
348+/* The tid of the LRU manager thread */
349+UNIV_INTERN os_tid_t srv_lru_manager_tid;
350+
351 /* The tids of the purge threads */
352 UNIV_INTERN os_tid_t srv_purge_tids[SRV_MAX_N_PURGE_THREADS];
353
354@@ -368,7 +371,7 @@
355 /* The tid of the master thread */
356 UNIV_INTERN os_tid_t srv_master_tid;
357
358-/* The relative scheduling priority of the cleaner thread */
359+/* The relative scheduling priority of the cleaner and LRU manager threads */
360 UNIV_INTERN ulint srv_sched_priority_cleaner = 19;
361
362 /* The relative scheduling priority of the purge threads */
363
364=== modified file 'Percona-Server/storage/innobase/srv/srv0start.cc'
365--- Percona-Server/storage/innobase/srv/srv0start.cc 2013-10-23 08:48:28 +0000
366+++ Percona-Server/storage/innobase/srv/srv0start.cc 2013-10-23 12:17:08 +0000
367@@ -2683,6 +2683,7 @@
368 if (!srv_read_only_mode) {
369 os_thread_create(buf_flush_page_cleaner_thread, NULL, NULL);
370 }
371+ os_thread_create(buf_flush_lru_manager_thread, NULL, NULL);
372
373 #ifdef UNIV_DEBUG
374 /* buf_debug_prints = TRUE; */

Subscribers

People subscribed via source and target branches