summaryrefslogtreecommitdiff
path: root/db-4.8.30/test/rep086.tcl
blob: 9b4222d20ce1874fa30ab1aac19b76195a2621d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# See the file LICENSE for redistribution information.
#
# Copyright (c) 2009 Oracle.  All rights reserved.
#
# TEST	rep086
# TEST  Interrupted abbreviated internal init.
# TEST
# TEST  Make sure we cleanly remove partially loaded named in-memory
# TEST	databases (NIMDBs).

proc rep086 { method { tnum "086" } args } {

	source ./include.tcl 

	# Run for btree and queue only.  Since this is a NIMDB test, 
	# skip queueext. 
	if { $checking_valid_methods } {
		set test_methods {}
		foreach method $valid_methods {
			if { [is_btree $method] == 1 || [is_queue $method] == 1 } {
				if { [is_queueext $method] == 0 } {
					lappend test_methods $method
				}
			}
		}
		return $test_methods
	}
	if { [is_btree $method] != 1 && [is_queue $method] != 1 } {
		puts "Skipping internal init test rep$tnum for method $method."
		return
	}
	if { [is_queueext $method] == 1 } {
		puts "Skipping in-memory database test rep$tnum for method $method."
		return
	}

	set args [convert_args $method $args]
	rep086_sub $method $tnum $args
}

proc rep086_sub { method tnum largs } {

	global testdir
	global util_path
	global rep_verbose
	global verbose_type
	
	set verbargs ""
	if { $rep_verbose == 1 } {
		set verbargs " -verbose {$verbose_type on} "
	}
	set omethod [convert_method $method]

	env_cleanup $testdir
	replsetup $testdir/MSGQUEUEDIR

	file mkdir [set dirs(A) $testdir/SITE_A]
	file mkdir [set dirs(B) $testdir/SITE_B]

	set pagesize 4096
	append largs " -pagesize $pagesize "
	set log_buf [expr $pagesize * 2]
	set log_max [expr $log_buf * 4]

	puts "Rep$tnum ($method): Test of interrupted abbreviated internal init."
	puts "\tRep$tnum.a: Create master and client."
	repladd 1
	set env_A_cmd "berkdb_env_noerr -create -txn \
	    $verbargs \
	    -log_buffer $log_buf -log_max $log_max -errpfx SITE_A \
	    -home $dirs(A) -rep_transport \[list 1 replsend\]"
	set envs(A) [eval $env_A_cmd -rep_master]

	# Open a client
	repladd 2
	set env_B_cmd "berkdb_env_noerr -create -txn \
	    $verbargs \
	    -log_buffer $log_buf -log_max $log_max -errpfx SITE_B \
	    -home $dirs(B) -rep_transport \[list 2 replsend\]"
	set envs(B) [eval $env_B_cmd -rep_client]

	set envlist "{$envs(A) 1} {$envs(B) 2}"
	process_msgs $envlist

	puts "\tRep$tnum.b: Create a regular DB and a few NIMDBs."
	set niter 200
	set start 0
	eval rep_test $method $envs(A) NULL $niter 0 0 0 $largs
	for { set i 1 } { $i <= 3 } { incr i } {
		set nimdb [eval {berkdb_open} -env $envs(A) -auto_commit \
		    -create $largs $omethod {""} "mynimdb$i"]
		eval rep_test $method $envs(A) \
		    $nimdb $niter $start $start 0 $largs
		$nimdb close
	}
	process_msgs $envlist

	puts "\tRep$tnum.c: Bounce client so it has to re-materialize the NIMDBs."
	$envs(B) close
	set envs(B) [eval $env_B_cmd -rep_client -recover]
	set envlist "{$envs(A) 1} {$envs(B) 2}"

	# Here's a summary reminder of the messaging that is taking place in
	# each of the proc_msgs_once message cycles.
	# 
	# 1. NEWCLIENT -> NEWMASTER -> VERIFY_REQ (the checkpoint written by
	#                        regular recovery)
	# 2.   -> VERIFY -> (no match) VERIFY_REQ (last txn commit in common)
	# 3.   -> VERIFY -> (match, but need NIMDBS) UPDATE_REQ
	# 4.   -> UPDATE -> PAGE_REQ
	# 5.   -> PAGE -> (limited to partial NIMDB content by rep_limit)

	proc_msgs_once $envlist
	proc_msgs_once $envlist
	proc_msgs_once $envlist
	proc_msgs_once $envlist

	# Before doing cycle # 5, set a ridiculously low limit, so that only the
	# first page of the database will be received on this next cycle.
	# 
	$envs(A) rep_limit 0 4
	proc_msgs_once $envlist

	# Just to make sure our test is working the way we think it should,
	# verify that we are indeed in REP_F_RECOVER_PAGE state.
	# 
	assert_rep_flag $dirs(B) REP_F_RECOVER_PAGE 1

	# Now, with only a partial materialization of the NIMDB, downgrade the
	# master, which should cause client to realize its internal init is
	# interrupted.
	# 
	$envs(A) rep_limit 0 0
	$envs(A) rep_start -client
	proc_msgs_once $envlist

	puts "\tRep$tnum.d: Try to open NIMDBs."
	for { set i 0 } { $i <= 3 } { incr i } {
		set cmd [list berkdb_open -env $envs(B) -auto_commit "" "mynimdb$i"]
		error_check_bad "open partially loaded NIMDB" [catch $cmd] 0
	}

	$envs(A) close
	$envs(B) close
	replclose $testdir/MSGQUEUEDIR
}