1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 2007-2009 Oracle.  All rights reserved.
4#
5# $Id$
6#
7# TEST	repmgr013
8# TEST	Site list test.
9# TEST
10# TEST	Configure a master and two clients where one client is a peer of
11# TEST	the other and verify resulting site lists.
12# TEST
13# TEST	Run for btree only because access method shouldn't matter.
14# TEST
15proc repmgr013 { method { niter 100 } { tnum "013" } args } {
16
17	source ./include.tcl
18
19	if { $is_freebsd_test == 1 } {
20		puts "Skipping replication manager test on FreeBSD platform."
21		return
22	}
23
24	if { $is_windows9x_test == 1 } {
25		puts "Skipping replication test on Win9x platform."
26		return
27	}
28
29	# Skip for all methods except btree.
30	if { $checking_valid_methods } {
31		return btree
32	}
33	if { [is_btree $method] == 0 } {
34		puts "Repmgr$tnum: skipping for non-btree method $method."
35		return
36	}
37
38	set args [convert_args $method $args]
39
40	puts "Repmgr$tnum ($method): repmgr site list test."
41	repmgr013_sub $method $niter $tnum $args
42}
43
44proc repmgr013_sub { method niter tnum largs } {
45	global testdir
46	global rep_verbose
47	global verbose_type
48	set nsites 3
49
50	set small_iter [expr $niter / 10]
51
52	set verbargs ""
53	if { $rep_verbose == 1 } {
54		set verbargs " -verbose {$verbose_type on} "
55	}
56
57	env_cleanup $testdir
58	set ports [available_ports $nsites]
59
60	set masterdir $testdir/MASTERDIR
61	set clientdir $testdir/CLIENTDIR
62	set clientdir2 $testdir/CLIENTDIR2
63
64	file mkdir $masterdir
65	file mkdir $clientdir
66	file mkdir $clientdir2
67
68	# Use different connection retry timeout values to handle any
69	# collisions from starting sites at the same time by retrying
70	# at different times.
71
72	puts "\tRepmgr$tnum.a: Start a master."
73	set ma_envcmd "berkdb_env_noerr -create $verbargs \
74	    -errpfx MASTER -home $masterdir -txn -rep -thread"
75	set masterenv [eval $ma_envcmd]
76	$masterenv repmgr -ack all -nsites $nsites \
77	    -timeout {conn_retry 20000000} \
78	    -local [list localhost [lindex $ports 0]] \
79	    -start master
80
81	puts "\tRepmgr$tnum.b: Start first client."
82	set cl_envcmd "berkdb_env_noerr -create $verbargs \
83	    -errpfx CLIENT -home $clientdir -txn -rep -thread"
84	set clientenv [eval $cl_envcmd]
85	$clientenv repmgr -ack all -nsites $nsites \
86	    -timeout {conn_retry 10000000} \
87	    -local [list localhost [lindex $ports 1]] \
88	    -remote [list localhost [lindex $ports 0]] \
89	    -remote [list localhost [lindex $ports 2]] \
90	    -start client
91	await_startup_done $clientenv
92
93	puts "\tRepmgr$tnum.c: Start second client as peer of first."
94	set cl2_envcmd "berkdb_env_noerr -create $verbargs \
95	    -errpfx CLIENT2 -home $clientdir2 -txn -rep -thread"
96	set clientenv2 [eval $cl2_envcmd]
97	$clientenv2 repmgr -ack all -nsites $nsites \
98	    -timeout {conn_retry 5000000} \
99	    -local [list localhost [lindex $ports 2]] \
100	    -remote [list localhost [lindex $ports 0]] \
101	    -remote [list localhost [lindex $ports 1] peer] \
102	    -start client
103	await_startup_done $clientenv2
104
105	puts "\tRepmgr$tnum.d: Get repmgr site lists and verify."
106	verify_sitelist [$masterenv repmgr_site_list]
107	verify_sitelist [$clientenv repmgr_site_list]
108	verify_sitelist [$clientenv2 repmgr_site_list]
109
110	error_check_good client2_close [$clientenv2 close] 0
111	error_check_good client_close [$clientenv close] 0
112	error_check_good masterenv_close [$masterenv close] 0
113}
114
115proc verify_sitelist { sitelist } {
116	# Make sure there are 2 other sites.
117	error_check_good lenchk [llength $sitelist] 2
118
119	# Make sure eid, port and status are integers, host is
120	# expected string value.
121	foreach tuple $sitelist {
122		error_check_good eidchk [string is integer -strict \
123		    [lindex $tuple 0]] 1
124		error_check_good hostchk [lindex $tuple 1] "localhost"
125		error_check_good eidchk [string is integer -strict \
126		    [lindex $tuple 2]] 1
127		error_check_bad statchk [lindex $tuple 3] unknown
128	}
129}
130