Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit e39a31e

Browse files
author
Sofia Kopikova
committed
PBCKP-964 fix bug with incremental restore of relation with more than one segment (always wrong checksum on non-zero segment) + add tests for it
1 parent 3b741ee commit e39a31e

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

tests/incr_restore_test.py

+120
Original file line numberDiff line numberDiff line change
@@ -2510,3 +2510,123 @@ def test_incr_restore_issue_313(self):
25102510
backup_id=last_backup_id, options=['--progress', '--incremental-mode=checksum'])
25112511
node.slow_start()
25122512
self.compare_pgdata(pgdata, self.pgdata_content(node.data_dir))
2513+
2514+
# @unittest.skip("skip")
2515+
def test_skip_pages_at_non_zero_segment_checksum(self):
2516+
if self.remote:
2517+
self.skipTest("Skipped because this test doesn't work properly in remote mode yet")
2518+
2519+
node = self.make_simple_node(
2520+
base_dir=os.path.join(self.module_name, self.fname, 'node'),
2521+
initdb_params=['--data-checksums'],
2522+
pg_options={'wal_log_hints': 'on'})
2523+
2524+
backup_dir = os.path.join(self.tmp_path, self.module_name, self.fname, 'backup')
2525+
self.init_pb(backup_dir)
2526+
self.add_instance(backup_dir, 'node', node)
2527+
self.set_archiving(backup_dir, 'node', node)
2528+
node.slow_start()
2529+
2530+
# create table of size > 1 GB, so it will have several segments
2531+
node.safe_psql(
2532+
'postgres',
2533+
"create table t as select i as a, i*2 as b, i*3 as c, i*4 as d, i*5 as e "
2534+
"from generate_series(1,20600000) i; "
2535+
"CHECKPOINT ")
2536+
2537+
filepath = node.safe_psql(
2538+
'postgres',
2539+
"SELECT pg_relation_filepath('t')"
2540+
).decode('utf-8').rstrip()
2541+
2542+
# segment .1 must exist in order to proceed this test
2543+
self.assertTrue(os.path.exists(f'{os.path.join(node.data_dir, filepath)}.1'))
2544+
2545+
# do full backup
2546+
self.backup_node(backup_dir, 'node', node)
2547+
2548+
node.safe_psql(
2549+
'postgres',
2550+
"DELETE FROM t WHERE a < 101; "
2551+
"CHECKPOINT")
2552+
2553+
# do incremental backup
2554+
self.backup_node(backup_dir, 'node', node, backup_type='page')
2555+
2556+
pgdata = self.pgdata_content(node.data_dir)
2557+
2558+
node.safe_psql(
2559+
'postgres',
2560+
"DELETE FROM t WHERE a < 201; "
2561+
"CHECKPOINT")
2562+
2563+
node.stop()
2564+
2565+
self.restore_node(
2566+
backup_dir, 'node', node, options=["-j", "4", "--incremental-mode=checksum", "--log-level-console=INFO"])
2567+
2568+
self.assertNotIn('WARNING: Corruption detected in file', self.output,
2569+
'Incremental restore copied pages from .1 datafile segment that were not changed')
2570+
2571+
pgdata_restored = self.pgdata_content(node.data_dir)
2572+
self.compare_pgdata(pgdata, pgdata_restored)
2573+
2574+
# @unittest.skip("skip")
2575+
def test_skip_pages_at_non_zero_segment_lsn(self):
2576+
if self.remote:
2577+
self.skipTest("Skipped because this test doesn't work properly in remote mode yet")
2578+
2579+
node = self.make_simple_node(
2580+
base_dir=os.path.join(self.module_name, self.fname, 'node'),
2581+
initdb_params=['--data-checksums'],
2582+
pg_options={'wal_log_hints': 'on'})
2583+
2584+
backup_dir = os.path.join(self.tmp_path, self.module_name, self.fname, 'backup')
2585+
self.init_pb(backup_dir)
2586+
self.add_instance(backup_dir, 'node', node)
2587+
self.set_archiving(backup_dir, 'node', node)
2588+
node.slow_start()
2589+
2590+
# create table of size > 1 GB, so it will have several segments
2591+
node.safe_psql(
2592+
'postgres',
2593+
"create table t as select i as a, i*2 as b, i*3 as c, i*4 as d, i*5 as e "
2594+
"from generate_series(1,20600000) i; "
2595+
"CHECKPOINT ")
2596+
2597+
filepath = node.safe_psql(
2598+
'postgres',
2599+
"SELECT pg_relation_filepath('t')"
2600+
).decode('utf-8').rstrip()
2601+
2602+
# segment .1 must exist in order to proceed this test
2603+
self.assertTrue(os.path.exists(f'{os.path.join(node.data_dir, filepath)}.1'))
2604+
2605+
# do full backup
2606+
self.backup_node(backup_dir, 'node', node)
2607+
2608+
node.safe_psql(
2609+
'postgres',
2610+
"DELETE FROM t WHERE a < 101; "
2611+
"CHECKPOINT")
2612+
2613+
# do incremental backup
2614+
self.backup_node(backup_dir, 'node', node, backup_type='page')
2615+
2616+
pgdata = self.pgdata_content(node.data_dir)
2617+
2618+
node.safe_psql(
2619+
'postgres',
2620+
"DELETE FROM t WHERE a < 201; "
2621+
"CHECKPOINT")
2622+
2623+
node.stop()
2624+
2625+
self.restore_node(
2626+
backup_dir, 'node', node, options=["-j", "4", "--incremental-mode=lsn", "--log-level-console=INFO"])
2627+
2628+
self.assertNotIn('WARNING: Corruption detected in file', self.output,
2629+
'Incremental restore copied pages from .1 datafile segment that were not changed')
2630+
2631+
pgdata_restored = self.pgdata_content(node.data_dir)
2632+
self.compare_pgdata(pgdata, pgdata_restored)

0 commit comments

Comments
 (0)