From 31ce61b37b8cb144486092a4bcb36a57da9a0a6a Mon Sep 17 00:00:00 2001 From: Dmitry Kudrin Date: Mon, 19 Apr 2021 22:42:46 +0300 Subject: [PATCH 1/2] Adds the option 'touch_ttl' that is assotiated with delay option in the release method of fifottl. Allows keep the task ttl unchanged when it necessary --- README.md | 6 ++++++ queue/abstract/driver/fifottl.lua | 12 +++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8a601728..2453b9fc 100644 --- a/README.md +++ b/README.md @@ -551,6 +551,12 @@ Example: queue.tube.list_of_sites:release(15, {delay=10}) Note: in the above example, the delay option means "the task cannot be executed again for 10 seconds". +Example: queue.tube.list_of_sites:release(15, {delay=10, touch_ttl=false}) + +Note: in the above example, the delay option means +"the task cannot be executed again for 10 seconds" and +the associated touch_ttl option means "the task ttl stays unchanged" + ## Peeking at a task ```lua diff --git a/queue/abstract/driver/fifottl.lua b/queue/abstract/driver/fifottl.lua index 6facf75b..48f0d813 100644 --- a/queue/abstract/driver/fifottl.lua +++ b/queue/abstract/driver/fifottl.lua @@ -300,12 +300,18 @@ function method.release(self, id, opts) if task == nil then return end + if opts.touch_ttl == nil then opts.touch_ttl = true end if opts.delay ~= nil and opts.delay > 0 then - task = self.space:update(id, { + local upd = { { '=', i_status, state.DELAYED }, - { '=', i_next_event, util.event_time(opts.delay) }, + { '=', i_next_event, util.event_time(opts.delay) } + } + if opts.touch_ttl then + table.insert(upd, { '+', i_ttl, util.time(opts.delay) } - }) + ) + end + task = self.space:update(id, upd) else task = self.space:update(id, { { '=', i_status, state.READY }, From 5816e2cf46c92ac55178c25a7e36c00f777c63dd Mon Sep 17 00:00:00 2001 From: Dmitry Kudrin Date: Tue, 20 Apr 2021 23:58:06 +0300 Subject: [PATCH 2/2] touch_ttl->keep_ttl. Add tests. Add keep_ttl option to utubettl --- README.md | 4 ++-- queue/abstract/driver/fifottl.lua | 3 +-- queue/abstract/driver/utubettl.lua | 11 ++++++++--- t/020-fifottl.t | 17 ++++++++++++++++- t/040-utubettl.t | 20 +++++++++++++++++++- test.sh | 1 + 6 files changed, 47 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 2453b9fc..49884ab3 100644 --- a/README.md +++ b/README.md @@ -551,11 +551,11 @@ Example: queue.tube.list_of_sites:release(15, {delay=10}) Note: in the above example, the delay option means "the task cannot be executed again for 10 seconds". -Example: queue.tube.list_of_sites:release(15, {delay=10, touch_ttl=false}) +Example: queue.tube.list_of_sites:release(15, {delay=10, keep_ttl=true}) Note: in the above example, the delay option means "the task cannot be executed again for 10 seconds" and -the associated touch_ttl option means "the task ttl stays unchanged" +the associated keep_ttl option means "the task ttl stays unchanged" ## Peeking at a task diff --git a/queue/abstract/driver/fifottl.lua b/queue/abstract/driver/fifottl.lua index 48f0d813..bf532a42 100644 --- a/queue/abstract/driver/fifottl.lua +++ b/queue/abstract/driver/fifottl.lua @@ -300,13 +300,12 @@ function method.release(self, id, opts) if task == nil then return end - if opts.touch_ttl == nil then opts.touch_ttl = true end if opts.delay ~= nil and opts.delay > 0 then local upd = { { '=', i_status, state.DELAYED }, { '=', i_next_event, util.event_time(opts.delay) } } - if opts.touch_ttl then + if not opts.keep_ttl then table.insert(upd, { '+', i_ttl, util.time(opts.delay) } ) diff --git a/queue/abstract/driver/utubettl.lua b/queue/abstract/driver/utubettl.lua index 897805b2..8217415c 100644 --- a/queue/abstract/driver/utubettl.lua +++ b/queue/abstract/driver/utubettl.lua @@ -323,11 +323,16 @@ function method.release(self, id, opts) return end if opts.delay ~= nil and opts.delay > 0 then - task = self.space:update(id, { + local upd = { { '=', i_status, state.DELAYED }, - { '=', i_next_event, util.event_time(opts.delay) }, + { '=', i_next_event, util.event_time(opts.delay) } + } + if not opts.keep_ttl then + table.insert(upd, { '+', i_ttl, util.time(opts.delay) } - }) + ) + end + task = self.space:update(id, upd) if task ~= nil then return process_neighbour(self, task, 'release') end diff --git a/t/020-fifottl.t b/t/020-fifottl.t index 4a94769e..4bd7dc8a 100755 --- a/t/020-fifottl.t +++ b/t/020-fifottl.t @@ -2,7 +2,7 @@ local fiber = require('fiber') local test = require('tap').test() -test:plan(16) +test:plan(17) local queue = require('queue') local state = require('queue.abstract.state') @@ -245,6 +245,21 @@ test:test('ttl after delay test', function(test) test:is(task.ttr, TTR * 1000000, 'check TTR after release') end) +test:test('ttl after delay test with keep_ttl', function(test) + local TTL = 10 + local TTR = 20 + local DELTA = 5 + test:plan(2) + box.cfg{} + local tube = queue.create_tube('test_ttl_release_keep', 'fifottl', { if_not_exists = true }) + tube:put({'test_task'}, { ttl = TTL, ttr = TTR }) + tube:take() + tube:release(0, { delay = DELTA, keep_ttl = true }) + local task = box.space.test_ttl_release_keep:get(0) + test:is(task.ttl, TTL * 1000000, 'check TTL after release') + test:is(task.ttr, TTR * 1000000, 'check TTR after release') +end) + -- gh-96: infinite loop after dropping a tube with a burried task test:test('buried task in a dropped queue', function(test) test:plan(1) diff --git a/t/040-utubettl.t b/t/040-utubettl.t index 5af2d9f1..c7f1aba4 100755 --- a/t/040-utubettl.t +++ b/t/040-utubettl.t @@ -3,7 +3,7 @@ local yaml = require('yaml') local fiber = require('fiber') local test = (require('tap')).test() -test:plan(17) +test:plan(18) local queue = require('queue') local state = require('queue.abstract.state') @@ -203,6 +203,24 @@ test:test('release[delay] in utube', function(test) test:is(state, 2, 'state was changed') end) +test:test('release[delay, keep_ttl] in utube', function(test) + test:plan(5) + local TTL = 10 + local DELAY = 5 + + test:ok(tube:put(123, {utube = 'fgh', ttl = TTL}), 'task was put') + local taken = tube:take() + test:ok(taken, 'task was taken ' .. taken[1]) + test:is(taken[3], 123, 'task.data') + tube:release(taken[1], { delay = DELAY, keep_ttl = true }) + local task = box.space.test:get(taken[1]) + test:is(task.ttl, TTL * 1000000, 'check TTL with keep_ttl after release') + tube:take() + tube:release(taken[1], {delay = DELAY}) + task = box.space.test:get(taken[1]) + test:is(task.ttl, (TTL + DELAY) * 1000000, 'check TTL without keep_ttl after release') +end) + test:test('if_not_exists test', function(test) test:plan(2) local tube = queue.create_tube('test_ine', 'utubettl', { diff --git a/test.sh b/test.sh index 32f7567a..44aebd9c 100755 --- a/test.sh +++ b/test.sh @@ -6,6 +6,7 @@ VERSION=${VERSION:-2_2} curl -sfL https://packagecloud.io/tarantool/${VERSION}/gpgkey | sudo apt-key add - release=`lsb_release -c -s` +release='focal' sudo apt-get install -y apt-transport-https