diff --git a/src/box/vinyl.c b/src/box/vinyl.c index 8bd47e1d690c1e72e86b56ae1fd240a78fd6ec41..3a582b6fedf3aa71355387471c6aa75fe9e20606 100644 --- a/src/box/vinyl.c +++ b/src/box/vinyl.c @@ -2740,7 +2740,7 @@ vinyl_engine_begin_checkpoint(struct engine *engine, bool is_scheduled) */ if (lsregion_used(&env->mem_env.allocator) == 0) return 0; - if (vy_scheduler_begin_checkpoint(&env->scheduler) != 0) + if (vy_scheduler_begin_checkpoint(&env->scheduler, is_scheduled) != 0) return -1; return 0; } diff --git a/src/box/vy_scheduler.c b/src/box/vy_scheduler.c index bf4c3fe58eda8088f139cd2c7e82e57325aaaf40..cf58d5f60d9b852b7a18515e85004fe0b163b9f2 100644 --- a/src/box/vy_scheduler.c +++ b/src/box/vy_scheduler.c @@ -681,22 +681,29 @@ vy_scheduler_complete_dump(struct vy_scheduler *scheduler) } int -vy_scheduler_begin_checkpoint(struct vy_scheduler *scheduler) +vy_scheduler_begin_checkpoint(struct vy_scheduler *scheduler, bool is_scheduled) { assert(!scheduler->checkpoint_in_progress); /* - * If the scheduler is throttled due to errors, do not wait + * If checkpoint is manually launched (via box.snapshot()) + * then ignore throttling and force dump process. Otherwise, + * if the scheduler is throttled due to errors, do not wait * until it wakes up as it may take quite a while. Instead * fail checkpoint immediately with the last error seen by * the scheduler. */ if (scheduler->is_throttled) { - struct error *e = diag_last_error(&scheduler->diag); - diag_set_error(diag_get(), e); - say_error("cannot checkpoint vinyl, " - "scheduler is throttled with: %s", e->errmsg); - return -1; + if (is_scheduled) { + struct error *e = diag_last_error(&scheduler->diag); + diag_set_error(diag_get(), e); + say_error("cannot checkpoint vinyl, " + "scheduler is throttled with: %s", e->errmsg); + return -1; + } + say_info("scheduler is unthrottled due to manual checkpoint " + "process"); + scheduler->is_throttled = false; } if (!vy_scheduler_dump_in_progress(scheduler)) { diff --git a/src/box/vy_scheduler.h b/src/box/vy_scheduler.h index bc953975ec7f7ef6d90e85b019de9f259328f696..42e7b2f2ff1aaa5013e6f7104e843a976fa9612a 100644 --- a/src/box/vy_scheduler.h +++ b/src/box/vy_scheduler.h @@ -225,7 +225,7 @@ vy_scheduler_force_compaction(struct vy_scheduler *scheduler, * after that. */ int -vy_scheduler_begin_checkpoint(struct vy_scheduler *); +vy_scheduler_begin_checkpoint(struct vy_scheduler *, bool); /** * Wait for checkpoint. Please call vy_scheduler_end_checkpoint() diff --git a/test/box/errinj.result b/test/box/errinj.result index 55f6a3ceee1d3b5a50ae7c8e2a0d3802ba22b69f..3bc031e394b4d6112ee45b3b19e98d8ffc4d7dc7 100644 --- a/test/box/errinj.result +++ b/test/box/errinj.result @@ -1589,10 +1589,6 @@ errinj.set('ERRINJ_VY_GC', true) --- - ok ... -errinj.set('ERRINJ_VY_SCHED_TIMEOUT', 0.001) ---- -- ok -... errinj.set('ERRINJ_VY_RUN_FILE_RENAME', true) --- - ok @@ -1629,10 +1625,6 @@ errinj.set('ERRINJ_VY_INDEX_FILE_RENAME', false) --- - ok ... -errinj.set('ERRINJ_VY_SCHED_TIMEOUT', 0) ---- -- ok -... errinj.set('ERRINJ_VY_GC', false) --- - ok diff --git a/test/box/errinj.test.lua b/test/box/errinj.test.lua index 5d8f4c63551b2b57b528e0b2b30455135fe5d928..bb76e079109c9e1efa4c11e42a50321928a2b99d 100644 --- a/test/box/errinj.test.lua +++ b/test/box/errinj.test.lua @@ -575,7 +575,6 @@ box.snapshot() errinj.set('ERRINJ_VY_LOG_FILE_RENAME', false) errinj.set('ERRINJ_VY_GC', true) -errinj.set('ERRINJ_VY_SCHED_TIMEOUT', 0.001) errinj.set('ERRINJ_VY_RUN_FILE_RENAME', true) box.space.test:insert{1} @@ -590,7 +589,6 @@ box.space.test:insert{2} box.snapshot() -- error errinj.set('ERRINJ_VY_INDEX_FILE_RENAME', false) -errinj.set('ERRINJ_VY_SCHED_TIMEOUT', 0) errinj.set('ERRINJ_VY_GC', false) test_run:cmd('restart server default') diff --git a/test/vinyl/errinj.result b/test/vinyl/errinj.result index 2bd701f70b1d3ca946be85e1d558796da0af74e3..bf49f4e465526d46972ee26cd2410da1974fe330 100644 --- a/test/vinyl/errinj.result +++ b/test/vinyl/errinj.result @@ -10,10 +10,6 @@ fiber = require('fiber') errinj = box.error.injection --- ... -errinj.set("ERRINJ_VY_SCHED_TIMEOUT", 0.040) ---- -- ok -... -- -- Lost data in case of dump error -- @@ -361,10 +357,6 @@ box.snapshot(); s:drop() --- ... -errinj.set("ERRINJ_VY_SCHED_TIMEOUT", 0) ---- -- ok -... -- -- Check that upsert squash fiber does not crash if index or -- in-memory tree is gone. diff --git a/test/vinyl/errinj.test.lua b/test/vinyl/errinj.test.lua index 750d3bfe85530b34b1656097482a7fc487354b2c..2c8121364f51699315f4edbbf6148d3a71133aa3 100644 --- a/test/vinyl/errinj.test.lua +++ b/test/vinyl/errinj.test.lua @@ -2,7 +2,6 @@ test_run = require('test_run').new() fio = require('fio') fiber = require('fiber') errinj = box.error.injection -errinj.set("ERRINJ_VY_SCHED_TIMEOUT", 0.040) -- -- Lost data in case of dump error -- @@ -126,8 +125,6 @@ box.snapshot(); #s:select({1}) s:drop() -errinj.set("ERRINJ_VY_SCHED_TIMEOUT", 0) - -- -- Check that upsert squash fiber does not crash if index or -- in-memory tree is gone. diff --git a/test/vinyl/errinj_stat.result b/test/vinyl/errinj_stat.result index a8b5e031284f4d99f7c485dec6992cbeab2f80fb..38c27a9245e5b471a707b22243f1dcf0072d869e 100644 --- a/test/vinyl/errinj_stat.result +++ b/test/vinyl/errinj_stat.result @@ -214,10 +214,6 @@ errinj.set('ERRINJ_VY_RUN_WRITE', true) --- - ok ... -errinj.set('ERRINJ_VY_SCHED_TIMEOUT', 0.01) ---- -- ok -... s:replace{2} --- - [2] @@ -241,10 +237,6 @@ errinj.set('ERRINJ_VY_RUN_WRITE', false) --- - ok ... -errinj.set('ERRINJ_VY_SCHED_TIMEOUT', 0) ---- -- ok -... test_run:wait_cond(function() return box.stat.vinyl().scheduler.tasks_completed > 1 end) --- - true diff --git a/test/vinyl/errinj_stat.test.lua b/test/vinyl/errinj_stat.test.lua index f331d9c2dfd7cb03258bc2fae3edd972c8a08480..0d1e4af8e2e8d0326773d4488166190c56678a82 100644 --- a/test/vinyl/errinj_stat.test.lua +++ b/test/vinyl/errinj_stat.test.lua @@ -66,14 +66,12 @@ stat.tasks_inprogress == 0 stat.tasks_completed == 1 stat.tasks_failed == 0 errinj.set('ERRINJ_VY_RUN_WRITE', true) -errinj.set('ERRINJ_VY_SCHED_TIMEOUT', 0.01) s:replace{2} box.snapshot() stat = box.stat.vinyl().scheduler stat.tasks_completed == 1 stat.tasks_failed > 0 errinj.set('ERRINJ_VY_RUN_WRITE', false) -errinj.set('ERRINJ_VY_SCHED_TIMEOUT', 0) test_run:wait_cond(function() return box.stat.vinyl().scheduler.tasks_completed > 1 end) box.snapshot() i:compact() diff --git a/test/vinyl/errinj_vylog.result b/test/vinyl/errinj_vylog.result index 8fb5deda4a7bf0cefd95158c823a005976dd2f64..b9ae9332e9b615ad1a58ae2d94c6acdd2dccc208 100644 --- a/test/vinyl/errinj_vylog.result +++ b/test/vinyl/errinj_vylog.result @@ -52,13 +52,6 @@ _ = s:create_index('pk') _ = s:insert{1, 'x'} --- ... -SCHED_TIMEOUT = 0.05 ---- -... -box.error.injection.set('ERRINJ_VY_SCHED_TIMEOUT', SCHED_TIMEOUT) ---- -- ok -... box.error.injection.set('ERRINJ_VY_LOG_FLUSH', true); --- - ok @@ -71,13 +64,6 @@ box.error.injection.set('ERRINJ_VY_LOG_FLUSH', false); --- - ok ... -fiber.sleep(2 * SCHED_TIMEOUT) ---- -... -box.error.injection.set('ERRINJ_VY_SCHED_TIMEOUT', 0) ---- -- ok -... _ = s:insert{2, 'y'} --- ... @@ -161,24 +147,10 @@ s2.index.pk:drop() --- ... -- pending records must not be rolled back on error -SCHED_TIMEOUT = 0.05 ---- -... -box.error.injection.set('ERRINJ_VY_SCHED_TIMEOUT', SCHED_TIMEOUT) ---- -- ok -... box.snapshot() -- error --- - error: Error injection 'vinyl log flush' ... -fiber.sleep(2 * SCHED_TIMEOUT) ---- -... -box.error.injection.set('ERRINJ_VY_SCHED_TIMEOUT', 0) ---- -- ok -... box.error.injection.set('ERRINJ_VY_LOG_FLUSH', false); --- - ok diff --git a/test/vinyl/errinj_vylog.test.lua b/test/vinyl/errinj_vylog.test.lua index 5ec58682ef2acb8b801f6f6360003f0d6cec97b9..4401f301502c82bb996a862d6e2881d719763deb 100644 --- a/test/vinyl/errinj_vylog.test.lua +++ b/test/vinyl/errinj_vylog.test.lua @@ -27,15 +27,11 @@ s = box.schema.space.create('test', {engine = 'vinyl'}) _ = s:create_index('pk') _ = s:insert{1, 'x'} -SCHED_TIMEOUT = 0.05 -box.error.injection.set('ERRINJ_VY_SCHED_TIMEOUT', SCHED_TIMEOUT) box.error.injection.set('ERRINJ_VY_LOG_FLUSH', true); box.snapshot() box.error.injection.set('ERRINJ_VY_LOG_FLUSH', false); -fiber.sleep(2 * SCHED_TIMEOUT) -box.error.injection.set('ERRINJ_VY_SCHED_TIMEOUT', 0) _ = s:insert{2, 'y'} @@ -79,11 +75,7 @@ _ = s1:insert{3, 'c'} s2.index.pk:drop() -- pending records must not be rolled back on error -SCHED_TIMEOUT = 0.05 -box.error.injection.set('ERRINJ_VY_SCHED_TIMEOUT', SCHED_TIMEOUT) box.snapshot() -- error -fiber.sleep(2 * SCHED_TIMEOUT) -box.error.injection.set('ERRINJ_VY_SCHED_TIMEOUT', 0) box.error.injection.set('ERRINJ_VY_LOG_FLUSH', false);