From 13da47904809c09fb01eb7574cc387934f70948d Mon Sep 17 00:00:00 2001 From: Philip O'Toole Date: Fri, 15 Dec 2023 09:19:09 -0500 Subject: [PATCH] Add end-to-end test of dealing with chunked loads This test is to ensure that if an older system with this type of commands present in the log can be handled OK. --- system_test/e2e/helpers.py | 5 ++++ system_test/e2e/testdata/v8/chunked/db.sqlite | Bin 0 -> 8192 bytes system_test/e2e/testdata/v8/chunked/raft.db | Bin 0 -> 65536 bytes system_test/e2e/upgrade.py | 25 ++++++++++++++---- 4 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 system_test/e2e/testdata/v8/chunked/db.sqlite create mode 100644 system_test/e2e/testdata/v8/chunked/raft.db diff --git a/system_test/e2e/helpers.py b/system_test/e2e/helpers.py index 934effc8..ca69b947 100644 --- a/system_test/e2e/helpers.py +++ b/system_test/e2e/helpers.py @@ -60,6 +60,11 @@ def temp_file(): f.close() return f.name +def copy_dir(src): + temp_dir = tempfile.mkdtemp() + shutil.copytree(src, temp_dir, dirs_exist_ok=True) + return temp_dir + def write_random_file(data, mode='w'): f = tempfile.NamedTemporaryFile(mode, delete=False) f.write(data) diff --git a/system_test/e2e/testdata/v8/chunked/db.sqlite b/system_test/e2e/testdata/v8/chunked/db.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..16245f51bd4f48c0ec3fde74b83283091440f530 GIT binary patch literal 8192 zcmeI#!3u&v5C-5`4eSyI9=gu4AiDGdSu7EmnQf3qBLyK{5MQ7-=?Qu~&uxTf&%r;; zusbj?@ZIKo3W_GVFJe?-JJ+fSDlh!7dzLKo`bs)_luX$SBc^4|V zl`)4$#o;9gIEr@%KTdcrlQ~yunX!^rHT&J>ExB#)atuHK0uX=z1Rwwb2tWV=5P$## QAn;cLLt)b-FLafD0C_Sar~m)} literal 0 HcmV?d00001 diff --git a/system_test/e2e/testdata/v8/chunked/raft.db b/system_test/e2e/testdata/v8/chunked/raft.db new file mode 100644 index 0000000000000000000000000000000000000000..5094f0b299f4172d61a55a0dc4a4f0b7968a5ed7 GIT binary patch literal 65536 zcmeI(eQXnD9Ki9m+q&*G17~o-M4Uqs!=QtLIDs&jfjLOPfrJ1qWxb9`ZAV*Vl7(#| z`$G|(CLkIn3OJZ?Fnl4PV&zREL{K!~P|ChYl~!c#ilOv)McaHv$eJ%G*;V>B?1T_ zfB*srAbB)lW5jy8m@~yJrwL+~v9^7ZSkG4DG4uR>#T%Tg_@5B($SHBWGZ1{#7gWYL zy)KWh!s(gq3j_-tcKaZ0i+*qaTu)U{DR)*^d#V&yd6n0t)O0pv%Jldu0|{!t0s#aN zKmY**5I_I{1Q0*~fm=jCyA-x`U74FqM@8S|b-7(3^vH^E7bUc8f%|lm=yi_Wbsgf-2ZiT|7JCQT#ZfQAqBa; zOpQy`Sj%6$ZEkEWs;*YVz<{eL7+O>83_3eZBO6-E6#tWoKhU(OrO4&-D}g{;^k~DI zCB-rCtSg)6cKe-`imCOXnxNthRQbGt(Ap9?=3rhUMVGX7;LYYm2Y=DocRvNpketH1#Wx3%kEYND=xP~8REz?=T_eJoU|5W zG~v@5bAPX;cdu$w@42S-i5s(u22FKm@A~G~M}A1&P;++QftqI~ zTs$@M;HnWBx#_L-e=WC7T$^xY-`rs7^iSGfxb(`N=L`Cd5FHMO$7WwxBFB}w+a&6G z7Rf-oBt`Y?Q)S^HUC*Y7o=u9gW0u^0x{ie!yCys|#w&!K%zMG_mZ;r-u?6H78k z%o>&0jt@6oxyHm2t|Kw4L1M{KiS2F~;L#=amJoX*-tR(U?tDF2QL5$cZ0k|aPv#l# z{k=SC=Jw+~URp8yu@_74S-fh&Yg(=^o737RFTHfIe9`{0%u;bW!r`g@oK?oBAlaa& zwy2)&?U*$~*VCDzr_7Cr5|!Y$#qVb868tw`Uh8#yM^X$DON~nGU~^sGH71sP9f_qHB$gJH*mrf? zg1W>i#3?P0^OV|hhv-jfdxmLL;^JfTx9qn5a$ua}^pTvM;gnFpAKQk{DI6+K>}S4d z>y1xrnn9ZBQE47Nwquws%>g3K`{GP9 z>dAhwCTqG{{l8GuJ7uiZ&pk15vl?sl|JgD1|8p_%f|&aMN?f!pJs*g`6) literal 0 HcmV?d00001 diff --git a/system_test/e2e/upgrade.py b/system_test/e2e/upgrade.py index b96c9ec6..c66f3b31 100644 --- a/system_test/e2e/upgrade.py +++ b/system_test/e2e/upgrade.py @@ -2,20 +2,23 @@ import os import unittest -from helpers import Node, Cluster, d_ +from helpers import Node, Cluster, d_, deprovision_node, copy_dir RQLITED_PATH = os.environ['RQLITED_PATH'] class TestUpgrade_v7(unittest.TestCase): '''Test that a v7 cluster can be upgraded to this version code''' def test(self): - n0 = Node(RQLITED_PATH, '1', api_addr='localhost:4001', raft_addr='localhost:4002', dir='testdata/v7/data.1') + dir1 = copy_dir('testdata/v7/data.1') + n0 = Node(RQLITED_PATH, '1', api_addr='localhost:4001', raft_addr='localhost:4002', dir=dir1) n0.start() - n1 = Node(RQLITED_PATH, '2', api_addr='localhost:4003', raft_addr='localhost:4004', dir='testdata/v7/data.2') + dir2 = copy_dir('testdata/v7/data.2') + n1 = Node(RQLITED_PATH, '2', api_addr='localhost:4003', raft_addr='localhost:4004', dir=dir2) n1.start() - n2 = Node(RQLITED_PATH, '3', api_addr='localhost:4005', raft_addr='localhost:4006', dir='testdata/v7/data.3') + dir3 = copy_dir('testdata/v7/data.3') + n2 = Node(RQLITED_PATH, '3', api_addr='localhost:4005', raft_addr='localhost:4006', dir=dir3) n2.start() self.cluster = Cluster([n0, n1, n2]) @@ -23,7 +26,7 @@ class TestUpgrade_v7(unittest.TestCase): # Check that each node upgraded a snapshot. for n in self.cluster.nodes: - self.assertTrue(n.expvar()['snapshot']['upgrade_ok'] == 1) + self.assertEqual(n.expvar()['snapshot']['upgrade_ok'], 1) # Check that each node has the right data. for n in self.cluster.nodes: @@ -32,5 +35,17 @@ class TestUpgrade_v7(unittest.TestCase): def tearDown(self): self.cluster.deprovision() +class TestUpgrade_v8_LoadChunk(unittest.TestCase): + '''Test that a v8 node with chunked load commands in the log can be upgraded to this version code''' + def test(self): + dir = copy_dir('testdata/v8/chunked') + self.n = Node(RQLITED_PATH, 'localhost:4002', api_addr='localhost:4001', raft_addr='localhost:4002', dir=dir) + self.n.start() + l = self.n.wait_for_leader() + self.assertEqual(self.n.query('SELECT COUNT(*) FROM foo', level='none'), d_("{'results': [{'values': [[1]], 'types': ['integer'], 'columns': ['COUNT(*)']}]}")) + + def tearDown(self): + deprovision_node(self.n) + if __name__ == "__main__": unittest.main(verbosity=2)