diff --git a/test/xlog/dup_key.result b/test/xlog/dup_key.result new file mode 100644 index 0000000000000000000000000000000000000000..53ae732283903afc0a2c0bcf9c8ba0ef645bc89a --- /dev/null +++ b/test/xlog/dup_key.result @@ -0,0 +1,54 @@ +space = box.schema.space.create('test') +--- +... +index = box.space.test:create_index('primary') +--- +... +box.space.test:insert{1, 'first tuple'} +--- +- [1, 'first tuple'] +... +box.space.test:insert{2, 'second tuple'} +--- +- [2, 'second tuple'] +... +.xlog exists +space = box.schema.space.create('test') +--- +... +index = box.space.test:create_index('primary') +--- +... +box.space.test:insert{1, 'first tuple'} +--- +- [1, 'first tuple'] +... +box.space.test:delete{1} +--- +- [1, 'first tuple'] +... +box.space.test:insert{1, 'third tuple'} +--- +- [1, 'third tuple'] +... +box.space.test:insert{2, 'fourth tuple'} +--- +- [2, 'fourth tuple'] +... +.xlog exists +check log line for 'Duplicate key' + +'Duplicate key' exists in server log + +box.space.test:get{1} +--- +- [1, 'first tuple'] +... +box.space.test:get{2} +--- +- [2, 'second tuple'] +... +box.space.test:len() +--- +- 2 +... diff --git a/test/xlog/dup_key.test.py b/test/xlog/dup_key.test.py new file mode 100644 index 0000000000000000000000000000000000000000..0c2db2109685c1a7c19f8bf8cbd423947d89c2b6 --- /dev/null +++ b/test/xlog/dup_key.test.py @@ -0,0 +1,62 @@ +import os +import yaml + +#print """ +#A test case for https://bugs.launchpad.net/tarantool/+bug/1052018 +#panic_on_wal_error doesn't work for duplicate key errors +#""" + +server.stop() +server.deploy() +lsn = int(yaml.load(server.admin("box.info.server.lsn", silent=True))[0]) +filename = str(lsn).zfill(20) + ".xlog" +wal_old = os.path.join(server.vardir, "old_" + filename) +wal = os.path.join(server.vardir, filename) + +# Create wal#1 +server.admin("space = box.schema.space.create('test')") +server.admin("index = box.space.test:create_index('primary')") +server.admin("box.space.test:insert{1, 'first tuple'}") +server.admin("box.space.test:insert{2, 'second tuple'}") +server.stop() + +# Save wal #1 +if os.access(wal, os.F_OK): + print ".xlog exists" + os.rename(wal, wal_old) + +lsn += 4 + +# Create another wal#1 +server.start() +server.admin("space = box.schema.space.create('test')") +server.admin("index = box.space.test:create_index('primary')") +server.admin("box.space.test:insert{1, 'first tuple'}") +server.admin("box.space.test:delete{1}") +server.stop() + +# Create wal#2 +server.start() +server.admin("box.space.test:insert{1, 'third tuple'}") +server.admin("box.space.test:insert{2, 'fourth tuple'}") +server.stop() + +if os.access(wal, os.F_OK): + print ".xlog exists" + # Replace wal#1 with saved copy + os.unlink(wal) + os.rename(wal_old, wal) + + +server.start() +line = 'Duplicate key' +print "check log line for '%s'" % line +print +if server.logfile_pos.seek_once(line) >= 0: + print "'%s' exists in server log" % line +print + +server.admin("box.space.test:get{1}") +server.admin("box.space.test:get{2}") +server.admin("box.space.test:len()") + diff --git a/test/xlog/empty.result b/test/xlog/empty.result new file mode 100644 index 0000000000000000000000000000000000000000..15ddd85fb22deb972593b45bcbe14752e91d9011 --- /dev/null +++ b/test/xlog/empty.result @@ -0,0 +1,8 @@ +.xlog.inprogress exists +_ = box.schema.space.create('test') +--- +- error: Failed to write to disk +... +_ = box.schema.space.create('test') +--- +... diff --git a/test/xlog/empty.test.py b/test/xlog/empty.test.py new file mode 100644 index 0000000000000000000000000000000000000000..ef5164f0f9bbff30a220ac522d969bc9d5380164 --- /dev/null +++ b/test/xlog/empty.test.py @@ -0,0 +1,28 @@ +import os +import yaml +from os.path import abspath + +# +# This test used to pass: +# +# Empty xlog.inprogress must be deleted during recovery +# +# it doesn't pass any more since an xlog with missing header +# can't be parsed by xdir_scan, thus we do nothing about it. +# +server.stop() +server.deploy() +lsn = str(yaml.load(server.admin("box.info.server.lsn", silent=True))[0]) +filename = os.path.join(server.vardir, lsn.zfill(20) + ".xlog.inprogress") +f = open(filename, "w+") +f.close() +server.start() +server.stop() +if os.access(filename, os.F_OK): + print ".xlog.inprogress exists" +# the server has started but is crippled since it +# can't override an existing file +server.start() +server.admin("_ = box.schema.space.create('test')") +os.unlink(filename) +server.admin("_ = box.schema.space.create('test')") diff --git a/test/xlog/lsn_gap.result b/test/xlog/lsn_gap.result new file mode 100644 index 0000000000000000000000000000000000000000..69d1de749e3474a4c68a5a5a9844d6dc6c305d9d --- /dev/null +++ b/test/xlog/lsn_gap.result @@ -0,0 +1,32 @@ +space = box.schema.space.create('test') +--- +... +index = box.space.test:create_index('primary') +--- +... +box.space.test:insert{1, 'first tuple'} +--- +- [1, 'first tuple'] +... +box.space.test:insert{2, 'second tuple'} +--- +- [2, 'second tuple'] +... +box.space.test:insert{3, 'third tuple'} +--- +- [3, 'third tuple'] +... +box.space.test:insert{4, 'fourth tuple'} +--- +- [4, 'fourth tuple'] +... +check log line for 'ignoring missing WAL' + +'ignoring missing WAL' exists in server log + +box.space.test:select{} +--- +- - [1, 'first tuple'] + - [2, 'second tuple'] + - [4, 'fourth tuple'] +... diff --git a/test/xlog/lsn_gap.test.py b/test/xlog/lsn_gap.test.py new file mode 100644 index 0000000000000000000000000000000000000000..3409ba3c0bb96ec3c3089bec0f6534c3a2976b5a --- /dev/null +++ b/test/xlog/lsn_gap.test.py @@ -0,0 +1,38 @@ +import os +import yaml +# +# gh-167: Replica can't find next xlog file if there is a gap in LSN +# + +server.stop() +server.deploy() + +# Create wal#1 +server.admin("space = box.schema.space.create('test')") +server.admin("index = box.space.test:create_index('primary')") +server.admin("box.space.test:insert{1, 'first tuple'}") +server.admin("box.space.test:insert{2, 'second tuple'}") +lsn = int(yaml.load(server.admin("box.info.server.lsn", silent=True))[0]) +wal = os.path.join(server.vardir, str(lsn).zfill(20) + ".xlog") +server.stop() +server.start() +server.admin("box.space.test:insert{3, 'third tuple'}") +server.stop() +server.start() +server.admin("box.space.test:insert{4, 'fourth tuple'}") +server.stop() + +# Remove xlog with {3, 'third tuple'} +os.unlink(wal) + +server.start() +line="ignoring missing WAL" +print "check log line for '%s'" % line +print +if server.logfile_pos.seek_once(line) >= 0: + print "'%s' exists in server log" % line +print + +# missing tuple from removed xlog +server.admin("box.space.test:select{}") + diff --git a/test/xlog/misc.result b/test/xlog/misc.result new file mode 100644 index 0000000000000000000000000000000000000000..7b524dfb587444fe895c114391b9653e81b37f6a --- /dev/null +++ b/test/xlog/misc.result @@ -0,0 +1,33 @@ + +# Inprogress xlog must be renamed before second insert. + +space = box.schema.space.create('tweedledum', { id = 0 }) +--- +... +.xlog.inprogress exists +index = space:create_index('primary', { type = 'hash' }) +--- +... +.xlog.inprogress has been successfully renamed + +# Inprogress xlog must be renamed during regular termination. + +box.space[0]:insert{3, 'third tuple'} +--- +- [3, 'third tuple'] +... +.xlog.inprogress exists +.xlog.inprogress has been successfully renamed + +# An inprogress xlog file with one record must be renamed during recovery. + +box.space[0]:insert{4, 'fourth tuple'} +--- +- [4, 'fourth tuple'] +... +box.space[0]:insert{5, 'Unfinished record'} +--- +- [5, 'Unfinished record'] +... +.xlog exists +.xlog.inprogress hash been successfully renamed diff --git a/test/xlog/misc.test.py b/test/xlog/misc.test.py new file mode 100644 index 0000000000000000000000000000000000000000..10293a6164faf6ad4f61027ffe4e85cccd68e31f --- /dev/null +++ b/test/xlog/misc.test.py @@ -0,0 +1,117 @@ +import os +import yaml + +from os.path import abspath + +# cleanup server.vardir +server.stop() +server.deploy() +lsn = int(yaml.load(server.admin("box.info.server.lsn", silent=True))[0]) +server.stop() + +print """ +# Inprogress xlog must be renamed before second insert. +""" +filename = str(lsn).zfill(20) + ".xlog" +wal_inprogress = os.path.join(server.vardir, filename + ".inprogress") +wal = os.path.join(server.vardir, filename) + +server.start() + +server.admin("space = box.schema.space.create('tweedledum', { id = 0 })") +if os.access(wal_inprogress, os.F_OK): + print ".xlog.inprogress exists" + +server.admin("index = space:create_index('primary', { type = 'hash' })") + +if os.access(wal, os.F_OK) and not os.access(wal_inprogress, os.F_OK): + print ".xlog.inprogress has been successfully renamed" +server.stop() +lsn += 2 + +print """ +# Inprogress xlog must be renamed during regular termination. +""" +filename = str(lsn).zfill(20) + ".xlog" +server.start() + +wal_inprogress = os.path.join(server.vardir, filename + ".inprogress") +wal = os.path.join(server.vardir, filename) + +server.admin("box.space[0]:insert{3, 'third tuple'}") + +if os.access(wal_inprogress, os.F_OK): + print ".xlog.inprogress exists" + +server.stop() + +if os.access(wal, os.F_OK) and not os.access(wal_inprogress, os.F_OK): + print ".xlog.inprogress has been successfully renamed" +lsn += 1 + +print """ +# An inprogress xlog file with one record must be renamed during recovery. +""" + +server.start() +filename = str(lsn).zfill(20) + ".xlog" +wal_inprogress = os.path.join(server.vardir, filename + ".inprogress") +wal = os.path.join(server.vardir, filename) +server.admin("box.space[0]:insert{4, 'fourth tuple'}") +server.admin("box.space[0]:insert{5, 'Unfinished record'}") +pid = int(yaml.load(server.admin("require('tarantool').pid()", silent=True))[0]) +from signal import SIGKILL +if pid > 0: + os.kill(pid, SIGKILL) +server.stop() + +if os.access(wal, os.F_OK): + print ".xlog exists" + # Remove last byte from xlog + f = open(wal, "a") + size = f.tell() + f.truncate(size - 1) + f.close() + os.rename(wal, wal_inprogress) + +server.start() + +if os.access(wal, os.F_OK) and not os.access(wal_inprogress, os.F_OK): + print ".xlog.inprogress hash been successfully renamed" +server.stop() +lsn += 1 + +# print """ +# # Empty (header only, no records) inprogress xlog must be deleted +# # during recovery. +# """ +# +# # If the previous test has failed, there is a dangling link +# # and symlink fails. +# try: +# os.symlink(abspath("box/just_header.xlog"), wal_inprogress) +# except OSError as e: +# print e +# +# server.start() +# +# if not os.access(wal_inprogress, os.F_OK) and not os.access(wal, os.F_OK): +# print "00000000000000000006.xlog.inprogress has been successfully deleted" +# server.stop() + +# print """ +# # Inprogress xlog with bad record must be deleted during recovery. +# """ +# +# # If the previous test has failed, there is a dangling link +# # and symlink fails. +# try: +# os.symlink(abspath("box/bad_record.xlog"), wal_inprogress) +# except OSError as e: +# print e +# +# server.start() +# +# if not os.access(wal_inprogress, os.F_OK) and not os.access(wal, os.F_OK): +# print "00000000000000000006.xlog.inprogress has been successfully deleted" + diff --git a/test/xlog/missing.result b/test/xlog/missing.result new file mode 100644 index 0000000000000000000000000000000000000000..900f4459d00e6946e0546be65ead17bab81d91f7 --- /dev/null +++ b/test/xlog/missing.result @@ -0,0 +1,38 @@ +space = box.schema.space.create('test') +--- +... +index = box.space.test:create_index('primary') +--- +... +box.space.test:insert{1, 'first tuple'} +--- +- [1, 'first tuple'] +... +box.space.test:insert{2, 'second tuple'} +--- +- [2, 'second tuple'] +... +box.space.test:insert{3, 'third tuple'} +--- +- [3, 'third tuple'] +... +box.space.test:delete{1} +--- +- [1, 'first tuple'] +... +box.space.test:delete{2} +--- +- [2, 'second tuple'] +... +box.space.test:delete{3} +--- +- [3, 'third tuple'] +... +check log line for 'ignoring missing WAL' + +'ignoring missing WAL' exists in server log + +box.space.test:select{} +--- +- [] +... diff --git a/test/xlog/missing.test.py b/test/xlog/missing.test.py new file mode 100644 index 0000000000000000000000000000000000000000..8833d1a6d0c3d77a247d19dee895102b47d1143a --- /dev/null +++ b/test/xlog/missing.test.py @@ -0,0 +1,43 @@ +import yaml +import os +# +# gh-716: infinite loop at start if missing xlog +# + +server.stop() +server.deploy() + +# Create wal#1 +server.admin("space = box.schema.space.create('test')") +server.admin("index = box.space.test:create_index('primary')") +server.stop() +server.start() +# these inserts will be in their own xlog, which then will +# get "lost" +lsn = int(yaml.load(server.admin("box.info.server.lsn", silent=True))[0]) +wal = os.path.join(server.vardir, str(lsn).zfill(20) + ".xlog") +server.admin("box.space.test:insert{1, 'first tuple'}") +server.admin("box.space.test:insert{2, 'second tuple'}") +server.admin("box.space.test:insert{3, 'third tuple'}") +server.stop() +server.start() +# put deletes in their own xlog +server.admin("box.space.test:delete{1}") +server.admin("box.space.test:delete{2}") +server.admin("box.space.test:delete{3}") +server.stop() + +# Remove xlog with inserts +os.unlink(wal) +# tarantool doesn't issue an LSN for deletes which delete nothing +# this may lead to infinite recursion at start +server.start() +line="ignoring missing WAL" +print "check log line for '%s'" % line +print +if server.logfile_pos.seek_once(line) >= 0: + print "'%s' exists in server log" % line +print + +# missing tuples from removed xlog +server.admin("box.space.test:select{}") diff --git a/test/xlog/xlog.result b/test/xlog/xlog.result deleted file mode 100644 index 0594df8747dd18a822847e8a50791e0748d47adb..0000000000000000000000000000000000000000 --- a/test/xlog/xlog.result +++ /dev/null @@ -1,157 +0,0 @@ - -# Inprogress xlog must be renamed before second insert. - -space = box.schema.space.create('tweedledum', { id = 0 }) ---- -... -.xlog.inprogress exists -index = space:create_index('primary', { type = 'hash' }) ---- -... -.xlog.inprogress has been successfully renamed - -# Inprogress xlog must be renamed during regular termination. - -box.space[0]:insert{3, 'third tuple'} ---- -- [3, 'third tuple'] -... -.xlog.inprogress exists -.xlog.inprogress has been successfully renamed - -# An inprogress xlog file with one record must be renamed during recovery. - -box.space[0]:insert{4, 'fourth tuple'} ---- -- [4, 'fourth tuple'] -... -box.space[0]:insert{5, 'Unfinished record'} ---- -- [5, 'Unfinished record'] -... -.xlog exists -.xlog.inprogress hash been successfully renamed -space = box.schema.space.create('test') ---- -... -index = box.space.test:create_index('primary') ---- -... -box.space.test:insert{1, 'first tuple'} ---- -- [1, 'first tuple'] -... -box.space.test:insert{2, 'second tuple'} ---- -- [2, 'second tuple'] -... -.xlog exists -space = box.schema.space.create('test') ---- -... -index = box.space.test:create_index('primary') ---- -... -box.space.test:insert{1, 'first tuple'} ---- -- [1, 'first tuple'] -... -box.space.test:delete{1} ---- -- [1, 'first tuple'] -... -box.space.test:insert{1, 'third tuple'} ---- -- [1, 'third tuple'] -... -box.space.test:insert{2, 'fourth tuple'} ---- -- [2, 'fourth tuple'] -... -.xlog exists -check log line for 'Duplicate key' - -'Duplicate key' exists in server log - -box.space.test:get{1} ---- -- [1, 'first tuple'] -... -box.space.test:get{2} ---- -- [2, 'second tuple'] -... -box.space.test:len() ---- -- 2 -... -space = box.schema.space.create('test') ---- -... -index = box.space.test:create_index('primary') ---- -... -box.space.test:insert{1, 'first tuple'} ---- -- [1, 'first tuple'] -... -box.space.test:insert{2, 'second tuple'} ---- -- [2, 'second tuple'] -... -box.space.test:insert{3, 'third tuple'} ---- -- [3, 'third tuple'] -... -box.space.test:insert{4, 'fourth tuple'} ---- -- [4, 'fourth tuple'] -... -check log line for 'ignoring missing WAL' - -'ignoring missing WAL' exists in server log - -box.space.test:select{} ---- -- - [1, 'first tuple'] - - [2, 'second tuple'] - - [4, 'fourth tuple'] -... -space = box.schema.space.create('test') ---- -... -index = box.space.test:create_index('primary') ---- -... -box.space.test:insert{1, 'first tuple'} ---- -- [1, 'first tuple'] -... -box.space.test:insert{2, 'second tuple'} ---- -- [2, 'second tuple'] -... -box.space.test:insert{3, 'third tuple'} ---- -- [3, 'third tuple'] -... -box.space.test:delete{1} ---- -- [1, 'first tuple'] -... -box.space.test:delete{2} ---- -- [2, 'second tuple'] -... -box.space.test:delete{3} ---- -- [3, 'third tuple'] -... -check log line for 'ignoring missing WAL' - -'ignoring missing WAL' exists in server log - -box.space.test:select{} ---- -- [] -... diff --git a/test/xlog/xlog.test.py b/test/xlog/xlog.test.py deleted file mode 100644 index c5782934e3523ffdc21bdc42a9c0faf69379ba82..0000000000000000000000000000000000000000 --- a/test/xlog/xlog.test.py +++ /dev/null @@ -1,274 +0,0 @@ -import os -import shutil -import yaml -import re - -from os.path import abspath - -# cleanup server.vardir -server.stop() -server.deploy() -lsn = int(yaml.load(server.admin("box.info.server.lsn", silent=True))[0]) -server.stop() - -print """ -# Inprogress xlog must be renamed before second insert. -""" -filename = str(lsn).zfill(20) + ".xlog" -wal_inprogress = os.path.join(server.vardir, filename + ".inprogress") -wal = os.path.join(server.vardir, filename) - -server.start() - -server.admin("space = box.schema.space.create('tweedledum', { id = 0 })") -if os.access(wal_inprogress, os.F_OK): - print ".xlog.inprogress exists" - -server.admin("index = space:create_index('primary', { type = 'hash' })") - -if os.access(wal, os.F_OK) and not os.access(wal_inprogress, os.F_OK): - print ".xlog.inprogress has been successfully renamed" -server.stop() -lsn += 2 - -print """ -# Inprogress xlog must be renamed during regular termination. -""" -filename = str(lsn).zfill(20) + ".xlog" -server.start() - -wal_inprogress = os.path.join(server.vardir, filename + ".inprogress") -wal = os.path.join(server.vardir, filename) - -server.admin("box.space[0]:insert{3, 'third tuple'}") - -if os.access(wal_inprogress, os.F_OK): - print ".xlog.inprogress exists" - -server.stop() - -if os.access(wal, os.F_OK) and not os.access(wal_inprogress, os.F_OK): - print ".xlog.inprogress has been successfully renamed" -lsn += 1 - -print """ -# An inprogress xlog file with one record must be renamed during recovery. -""" - -server.start() -filename = str(lsn).zfill(20) + ".xlog" -wal_inprogress = os.path.join(server.vardir, filename + ".inprogress") -wal = os.path.join(server.vardir, filename) -server.admin("box.space[0]:insert{4, 'fourth tuple'}") -server.admin("box.space[0]:insert{5, 'Unfinished record'}") -pid = int(yaml.load(server.admin("require('tarantool').pid()", silent=True))[0]) -from signal import SIGKILL -if pid > 0: - os.kill(pid, SIGKILL) -server.stop() - -if os.access(wal, os.F_OK): - print ".xlog exists" - # Remove last byte from xlog - f = open(wal, "a") - size = f.tell() - f.truncate(size - 1) - f.close() - os.rename(wal, wal_inprogress) - -server.start() - -if os.access(wal, os.F_OK) and not os.access(wal_inprogress, os.F_OK): - print ".xlog.inprogress hash been successfully renamed" -server.stop() -lsn += 1 - -# print """ -# # Empty (zero size) inprogress xlog must be deleted during recovery. -# """ -# -# wal_inprogress = os.path.join(server.vardir, "00000000000000000006.xlog.inprogress") -# wal = os.path.join(server.vardir, "00000000000000000006.xlog") -# -# os.symlink(abspath("box/empty.xlog"), wal_inprogress) -# server.start() -# -# if not os.access(wal_inprogress, os.F_OK) and not os.access(wal, os.F_OK): -# print "00000000000000000006.xlog.inprogress has been successfully deleted" -# server.stop() - -# print """ -# # Empty (header only, no records) inprogress xlog must be deleted -# # during recovery. -# """ -# -# # If the previous test has failed, there is a dangling link -# # and symlink fails. -# try: -# os.symlink(abspath("box/just_header.xlog"), wal_inprogress) -# except OSError as e: -# print e -# -# server.start() -# -# if not os.access(wal_inprogress, os.F_OK) and not os.access(wal, os.F_OK): -# print "00000000000000000006.xlog.inprogress has been successfully deleted" -# server.stop() - -# print """ -# # Inprogress xlog with bad record must be deleted during recovery. -# """ -# -# # If the previous test has failed, there is a dangling link -# # and symlink fails. -# try: -# os.symlink(abspath("box/bad_record.xlog"), wal_inprogress) -# except OSError as e: -# print e -# -# server.start() -# -# if not os.access(wal_inprogress, os.F_OK) and not os.access(wal, os.F_OK): -# print "00000000000000000006.xlog.inprogress has been successfully deleted" - -#print """ -#A test case for https://bugs.launchpad.net/tarantool/+bug/1052018 -#panic_on_wal_error doesn't work for duplicate key errors -#""" - -server.stop() -server.deploy() -lsn = int(yaml.load(server.admin("box.info.server.lsn", silent=True))[0]) -filename = str(lsn).zfill(20) + ".xlog" -wal_old = os.path.join(server.vardir, "old_" + filename) -wal = os.path.join(server.vardir, filename) - -# Create wal#1 -server.admin("space = box.schema.space.create('test')") -server.admin("index = box.space.test:create_index('primary')") -server.admin("box.space.test:insert{1, 'first tuple'}") -server.admin("box.space.test:insert{2, 'second tuple'}") -server.stop() - -# Save wal #1 -if os.access(wal, os.F_OK): - print ".xlog exists" - os.rename(wal, wal_old) - -lsn += 4 - -# Create another wal#1 -server.start() -server.admin("space = box.schema.space.create('test')") -server.admin("index = box.space.test:create_index('primary')") -server.admin("box.space.test:insert{1, 'first tuple'}") -server.admin("box.space.test:delete{1}") -server.stop() - -# Create wal#2 -server.start() -server.admin("box.space.test:insert{1, 'third tuple'}") -server.admin("box.space.test:insert{2, 'fourth tuple'}") -server.stop() - -if os.access(wal, os.F_OK): - print ".xlog exists" - # Replace wal#1 with saved copy - os.unlink(wal) - os.rename(wal_old, wal) - - -server.start() -line = 'Duplicate key' -print "check log line for '%s'" % line -print -if server.logfile_pos.seek_once(line) >= 0: - print "'%s' exists in server log" % line -print - -server.admin("box.space.test:get{1}") -server.admin("box.space.test:get{2}") -server.admin("box.space.test:len()") - - -# -# gh-167: Replica can't find next xlog file if there is a gap in LSN -# - -server.stop() -server.deploy() - -# Create wal#1 -server.admin("space = box.schema.space.create('test')") -server.admin("index = box.space.test:create_index('primary')") -server.admin("box.space.test:insert{1, 'first tuple'}") -server.admin("box.space.test:insert{2, 'second tuple'}") -lsn = int(yaml.load(server.admin("box.info.server.lsn", silent=True))[0]) -wal = os.path.join(server.vardir, str(lsn).zfill(20) + ".xlog") -server.stop() -server.start() -server.admin("box.space.test:insert{3, 'third tuple'}") -server.stop() -server.start() -server.admin("box.space.test:insert{4, 'fourth tuple'}") -server.stop() - -# Remove xlog with {3, 'third tuple'} -os.unlink(wal) - -server.start() -line="ignoring missing WAL" -print "check log line for '%s'" % line -print -if server.logfile_pos.seek_once(line) >= 0: - print "'%s' exists in server log" % line -print - -# missing tuple from removed xlog -server.admin("box.space.test:select{}") - -# -# gh-716: infinite loop at start if missing xlog -# - -server.stop() -server.deploy() - -# Create wal#1 -server.admin("space = box.schema.space.create('test')") -server.admin("index = box.space.test:create_index('primary')") -server.stop() -server.start() -# these inserts will be in their own xlog, which then will -# get "lost" -lsn = int(yaml.load(server.admin("box.info.server.lsn", silent=True))[0]) -wal = os.path.join(server.vardir, str(lsn).zfill(20) + ".xlog") -server.admin("box.space.test:insert{1, 'first tuple'}") -server.admin("box.space.test:insert{2, 'second tuple'}") -server.admin("box.space.test:insert{3, 'third tuple'}") -server.stop() -server.start() -# put deletes in their own xlog -server.admin("box.space.test:delete{1}") -server.admin("box.space.test:delete{2}") -server.admin("box.space.test:delete{3}") -server.stop() - -# Remove xlog with inserts -os.unlink(wal) -# tarantool doesn't issue an LSN for deletes which delete nothing -# this may lead to infinite recursion at start -server.start() -line="ignoring missing WAL" -print "check log line for '%s'" % line -print -if server.logfile_pos.seek_once(line) >= 0: - print "'%s' exists in server log" % line -print - -# missing tuples from removed xlog -server.admin("box.space.test:select{}") - -# cleanup -server.stop() -server.deploy()