1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 2001,2008 Oracle.  All rights reserved.
4#
5# $Id: rep014.tcl,v 12.16 2008/01/08 20:58:53 bostic Exp $
6#
7# TEST	rep014
8# TEST	Replication and multiple replication handles.
9# TEST	Test multiple client handles, opening and closing to
10# TEST	make sure we get the right openfiles.
11#
12proc rep014 { method { niter 10 } { tnum "014" } args } {
13
14	source ./include.tcl
15	if { $is_windows9x_test == 1 } {
16		puts "Skipping replication test on Win 9x platform."
17		return
18	}
19
20	# Run for all access methods.
21	if { $checking_valid_methods } {
22		return "ALL"
23	}
24
25	# We can't open two envs on HP-UX, so just skip the
26	# whole test since that is at the core of it.
27	if { $is_hp_test == 1 } {
28		puts "Rep$tnum: Skipping for HP-UX."
29		return
30	}
31
32	set args [convert_args $method $args]
33	set logsets [create_logsets 2]
34
35	# Run the body of the test with and without recovery.
36	foreach r $test_recopts {
37		foreach l $logsets {
38			set logindex [lsearch -exact $l "in-memory"]
39			if { $r == "-recover" && $logindex != -1 } {
40				puts "Rep$tnum: Skipping\
41				    for in-memory logs with -recover."
42				continue
43			}
44			puts "Rep$tnum ($method $r): Replication and openfiles."
45			puts "Rep$tnum: Master logs are [lindex $l 0]"
46			puts "Rep$tnum: Client logs are [lindex $l 1]"
47			rep014_sub $method $niter $tnum $l $r $args
48		}
49	}
50}
51
52proc rep014_sub { method niter tnum logset recargs largs } {
53	global testdir
54	global rep_verbose
55	global verbose_type
56
57	set verbargs ""
58	if { $rep_verbose == 1 } {
59		set verbargs " -verbose {$verbose_type on} "
60	}
61
62	env_cleanup $testdir
63	set orig_tdir $testdir
64
65	replsetup $testdir/MSGQUEUEDIR
66
67	set masterdir $testdir/MASTERDIR
68	set clientdir $testdir/CLIENTDIR
69	file mkdir $masterdir
70	file mkdir $clientdir
71
72	set m_logtype [lindex $logset 0]
73	set c_logtype [lindex $logset 1]
74
75	# In-memory logs require a large log buffer, and cannot
76	# be used with -txn nosync.
77	set m_logargs [adjust_logargs $m_logtype]
78	set c_logargs [adjust_logargs $c_logtype]
79	set m_txnargs [adjust_txnargs $m_logtype]
80	set c_txnargs [adjust_txnargs $c_logtype]
81
82	# Open a master.
83	repladd 1
84	set ma_envcmd "berkdb_env_noerr -create $m_txnargs $m_logargs \
85	    $verbargs -errpfx MASTER -home $masterdir \
86	    -rep_transport \[list 1 replsend\]"
87	set env0 [eval $ma_envcmd $recargs -rep_master]
88	set masterenv $env0
89
90	# Open a client.
91	repladd 2
92	set cl_envcmd "berkdb_env_noerr -create $c_txnargs $c_logargs \
93	    $verbargs -errpfx CLIENT1 -home $clientdir \
94	    -rep_transport \[list 2 replsend\]"
95	set env1 [eval $cl_envcmd $recargs]
96	error_check_good client_env [is_valid_env $env1] TRUE
97	set env2 [eval $cl_envcmd]
98	error_check_good client_env [is_valid_env $env2] TRUE
99
100	error_check_good e1_cl [$env1 rep_start -client] 0
101
102	set testfile "test$tnum.db"
103	set omethod [convert_method $method]
104	set env0db [eval {berkdb_open_noerr -env $env0 -auto_commit \
105	     -create -mode 0644} $largs $omethod $testfile]
106	set masterdb $env0db
107	error_check_good dbopen [is_valid_db $env0db] TRUE
108
109	# Bring the clients online by processing the startup messages.
110	set envlist "{$env0 1} {$env1 2}"
111	process_msgs $envlist
112
113	# Run a modified test001 in the master (and update clients).
114	puts "\tRep$tnum.a: Running test001 in replicated env."
115	eval rep_test $method $masterenv $masterdb $niter 0 0 0 0 $largs
116	process_msgs $envlist
117
118	puts "\tRep$tnum.b: Close and reopen client env."
119	error_check_good env1_close [$env1 close] 0
120	set env1 [eval $cl_envcmd]
121	error_check_good client_env [is_valid_env $env1] TRUE
122	error_check_good e1_cl [$env1 rep_start -client] 0
123
124	puts "\tRep$tnum.c: Run test in master again."
125	set start $niter
126	eval rep_test $method $masterenv $masterdb $niter $start 0 0 0 $largs
127	set envlist "{$env0 1} {$env1 2}"
128	process_msgs $envlist
129
130	puts "\tRep$tnum.d: Start and close 2nd client env."
131	error_check_good e2_pfx [$env2 errpfx CLIENT2] 0
132	error_check_good e2_cl [$env2 rep_start -client] 0
133	error_check_good env2_close [$env2 close] 0
134
135	puts "\tRep$tnum.e: Run test in master again."
136	set start [expr $start + $niter]
137	error_check_good e1_pfx [$env1 errpfx CLIENT1] 0
138	eval rep_test $method $masterenv $masterdb $niter $start 0 0 0 $largs
139	process_msgs $envlist
140
141	puts "\tRep$tnum.f: Open env2, close env1, use env2."
142	set env2 [eval $cl_envcmd]
143	error_check_good client_env [is_valid_env $env2] TRUE
144	error_check_good e1_pfx [$env2 errpfx CLIENT2] 0
145	error_check_good e2_cl [$env2 rep_start -client] 0
146	error_check_good e1_pfx [$env1 errpfx CLIENT1] 0
147	error_check_good env1_close [$env1 close] 0
148
149	puts "\tRep$tnum.g: Run test in master again."
150	set start [expr $start + $niter]
151	error_check_good e1_pfx [$env2 errpfx CLIENT2] 0
152	eval rep_test $method $masterenv $masterdb $niter $start 0 0 0 $largs
153	set envlist "{$env0 1} {$env2 2}"
154	process_msgs $envlist
155
156	puts "\tRep$tnum.h: Closing"
157	error_check_good env0db [$env0db close] 0
158	error_check_good env0_close [$env0 close] 0
159	error_check_good env2_close [$env2 close] 0
160	replclose $testdir/MSGQUEUEDIR
161	set testdir $orig_tdir
162	return
163}
164