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