File: repmgr101.tcl

package info (click to toggle)
db5.3 5.3.28%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 158,500 kB
  • sloc: ansic: 448,411; java: 111,824; tcl: 80,544; sh: 44,264; cs: 33,697; cpp: 21,604; perl: 14,557; xml: 10,799; makefile: 4,077; javascript: 1,998; yacc: 1,003; awk: 965; sql: 801; erlang: 342; python: 216; php: 24; asm: 14
file content (134 lines) | stat: -rw-r--r-- 4,594 bytes parent folder | download | duplicates (8)
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
# See the file LICENSE for redistribution information.
#
# Copyright (c) 2009, 2013 Oracle and/or its affiliates.  All rights reserved.
#
# TEST repmgr101
# TEST Repmgr support for multi-process master.
# TEST
# TEST Start two processes at the master.
# TEST Add a client site (not previously known to the master 
# TEST processes), and make sure
# TEST both master processes connect to it.

proc repmgr101 {  } {
	source ./include.tcl

	set tnum "101"
	puts "Repmgr$tnum: Two master processes both connect to a client."
	set site_prog [setup_site_prog]

	env_cleanup $testdir

	set masterdir $testdir/MASTERDIR
	set clientdir $testdir/CLIENTDIR

	file mkdir $masterdir
	file mkdir $clientdir

	set ports [available_ports 2]
	set master_port [lindex $ports 0]
	set client_port [lindex $ports 1]

	puts "\tRepmgr$tnum.a: Set up the master (on TCP port $master_port)."
	set master [open "| $site_prog" "r+"]
	fconfigure $master -buffering line
	puts $master "home $masterdir"
	make_dbconfig $masterdir \
	    [list [list repmgr_site 127.0.0.1 $master_port db_local_site on] \
	    "rep_set_config db_repmgr_conf_2site_strict off"]
	puts $master "output $testdir/m1output"
	puts $master "open_env"
	puts $master "start master"
	set ignored [gets $master]
	puts $master "open_db test.db"
	puts $master "put myKey myValue"

	# sync.
	puts $master "echo setup"
	set sentinel [gets $master]
	error_check_good echo_setup $sentinel "setup"
	
	puts "\tRepmgr$tnum.b: Start a second process at master."
	set m2 [open "| $site_prog" "r+"]
	fconfigure $m2 -buffering line
	puts $m2 "home $masterdir"
	puts $m2 "output $testdir/m2output"
	puts $m2 "open_env"
	puts $m2 "open_db test.db"
	puts $m2 "put sub1 abc"
	puts $m2 "echo firstputted"
	set sentinel [gets $m2]
	error_check_good m2_firstputted $sentinel "firstputted"

	puts "\tRepmgr$tnum.c: Set up the client (on TCP port $client_port)."
	set client [open "| $site_prog" "r+"]
	fconfigure $client -buffering line
	puts $client "home $clientdir"
	make_dbconfig $clientdir \
	    [list [list repmgr_site 127.0.0.1 $client_port db_local_site on] \
		 [list repmgr_site 127.0.0.1 $master_port db_bootstrap_helper on] \
	    "rep_set_config db_repmgr_conf_2site_strict off"]
	puts $client "output $testdir/coutput"
	puts $client "open_env"
	puts $client "start client"
	error_check_match start_client [gets $client] "*Successful*"

	puts "\tRepmgr$tnum.d: Wait for STARTUPDONE."
	set clientenv [berkdb_env -home $clientdir]
	await_startup_done $clientenv
	  
	# Initially there should be no rerequests.
	set pfs1 [stat_field $clientenv rep_stat "Log records requested"]
	error_check_good rerequest_count $pfs1 0

	# At this point we know that the master (in its main process) knows
	# about the client, so the client address should be in the shared
	# region.  The second master process will discover the address as a
	# result of being asked to send out the log records for the following
	# transaction.  At that point, it will initiate a connection attempt,
	# though without blocking the commit() call of the transaction.  This
	# means that this first transaction may or may not (probably won't) get
	# transmitted directly (as a "live" log record) to the client; it will
	# have to be "re-requested".  However, we can then wait for the
	# connection to be established, and thereafter all transactions should
	# be transmitted live; and we know that they must have arrived at the
	# client by the time the commit() returns, because of the ack policy.
	# 
	puts $m2 "put sub2 xyz"
	set count 0
	puts $m2 "is_connected $client_port"
	while {! [gets $m2]} {
		if {[incr count] > 30} {
			error "FAIL: couldn't connect within 30 seconds"
		}
		tclsleep 1
		puts $m2 "is_connected $client_port"
	}
	
	puts $m2 "put sub3 ijk"
	puts $m2 "put sub4 pqr"
	puts $m2 "echo putted"
	set sentinel [gets $m2]
	error_check_good m2_putted $sentinel "putted"
	puts $master "put another record"
	puts $master "put and again"
	puts $master "echo m1putted"
	set sentinel [gets $master]
	error_check_good m1_putted $sentinel "m1putted"

	puts "\tRepmgr$tnum.e: Check that replicated data is visible at client."
	puts $client "open_db test.db"
	set expected {{myKey myValue} {sub1 abc} {sub2 xyz} {another record}}
	verify_client_data $clientenv test.db $expected

	# make sure there weren't too many rerequests
	puts "\tRepmgr$tnum.f: Check rerequest stats"
	set pfs [stat_field $clientenv rep_stat "Log records requested"]
	error_check_good rerequest_count [expr $pfs <= 1] 1

	puts "\tRepmgr$tnum.g: Clean up."
	$clientenv close
	close $client
	close $master
	close $m2
}