1# See the file LICENSE for redistribution information.
2#
3# Copyright (c)-2009 Oracle.  All rights reserved.
4#
5# TEST repmgr023
6# TEST Repmgr support for multi-process master.
7# TEST
8# TEST Start two processes at the master.
9# TEST Add a client site (not previously known to the master
10# TEST processes), and make sure
11# TEST both master processes connect to it.
12
13proc repmgr023 {  } {
14	source ./include.tcl
15
16	set tnum "023"
17	puts "Repmgr$tnum: Two master processes both connect to a client."
18	set site_prog [setup_site_prog]
19
20	env_cleanup $testdir
21
22	set masterdir $testdir/MASTERDIR
23	set clientdir $testdir/CLIENTDIR
24
25	file mkdir $masterdir
26	file mkdir $clientdir
27
28	set ports [available_ports 2]
29	set master_port [lindex $ports 0]
30	set client_port [lindex $ports 1]
31
32	puts "\tRepmgr$tnum.a: Set up the master (on TCP port $master_port)."
33	set master [open "| $site_prog" "r+"]
34	fconfigure $master -buffering line
35	puts $master "home $masterdir"
36	puts $master "local $master_port"
37	make_dbconfig $masterdir {{rep_set_nsites 3}}
38	puts $master "output $testdir/m1output"
39	puts $master "open_env"
40	puts $master "start master"
41	set ignored [gets $master]
42	puts $master "open_db test.db"
43	puts $master "put myKey myValue"
44
45	# sync.
46	puts $master "echo setup"
47	set sentinel [gets $master]
48	error_check_good echo_setup $sentinel "setup"
49
50	puts "\tRepmgr$tnum.b: Start a second process at master."
51	set m2 [open "| $site_prog" "r+"]
52	fconfigure $m2 -buffering line
53	puts $m2 "home $masterdir"
54	puts $m2 "output $testdir/m2output"
55	puts $m2 "open_env"
56	puts $m2 "open_db test.db"
57	puts $m2 "put sub1 abc"
58	puts $m2 "echo firstputted"
59	set sentinel [gets $m2]
60	error_check_good m2_firstputted $sentinel "firstputted"
61
62	puts "\tRepmgr$tnum.c: Set up the client (on TCP port $client_port)."
63	set client [open "| $site_prog" "r+"]
64	fconfigure $client -buffering line
65	puts $client "home $clientdir"
66	puts $client "local $client_port"
67	make_dbconfig $clientdir {{rep_set_nsites 3}}
68	puts $client "output $testdir/coutput"
69	puts $client "open_env"
70	puts $client "remote localhost $master_port"
71	puts $client "start client"
72	error_check_match start_client [gets $client] "*Successful*"
73
74	puts "\tRepmgr$tnum.d: Wait for STARTUPDONE."
75	set clientenv [berkdb_env -home $clientdir]
76	await_startup_done $clientenv
77
78	# Initially there should be no rerequests.
79	set pfs1 [stat_field $clientenv rep_stat "Log records requested"]
80	error_check_good rerequest_count $pfs1 0
81
82	puts $m2 "put sub2 xyz"
83	puts $m2 "put sub3 ijk"
84	puts $m2 "put sub4 pqr"
85	puts $m2 "echo putted"
86	set sentinel [gets $m2]
87	error_check_good m2_putted $sentinel "putted"
88	puts $master "put another record"
89	puts $master "put and again"
90	puts $master "echo m1putted"
91	set sentinel [gets $master]
92	error_check_good m1_putted $sentinel "m1putted"
93
94	puts "\tRepmgr$tnum.e: Check that replicated data is visible at client."
95	puts $client "open_db test.db"
96	set expected {{myKey myValue} {sub1 abc} {sub2 xyz} {another record}}
97	verify_client_data $clientenv test.db $expected
98
99	# make sure there weren't too many rerequests
100	puts "\tRepmgr$tnum.f: Check rerequest stats"
101	set pfs [stat_field $clientenv rep_stat "Log records requested"]
102	error_check_good rerequest_count [expr $pfs <= 1] 1
103
104	puts "\tRepmgr$tnum.g: Clean up."
105	$clientenv close
106	close $client
107	close $master
108	close $m2
109}
110