1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 2001-2009 Oracle.  All rights reserved.
4#
5# $Id$
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	global databases_in_memory
16	global repfiles_in_memory
17
18	if { $is_windows9x_test == 1 } {
19		puts "Skipping replication test on Win 9x platform."
20		return
21	}
22
23	# Run for all access methods.
24	if { $checking_valid_methods } {
25		return "ALL"
26	}
27
28	# We can't open two envs on HP-UX, so just skip the
29	# whole test since that is at the core of it.
30	if { $is_hp_test == 1 } {
31		puts "Rep$tnum: Skipping for HP-UX."
32		return
33	}
34
35	set args [convert_args $method $args]
36	set logsets [create_logsets 2]
37
38	# Set up for on-disk or in-memory databases.
39	set msg "using on-disk databases"
40	if { $databases_in_memory } {
41		set msg "using named in-memory databases"
42		if { [is_queueext $method] } {
43			puts -nonewline "Skipping rep$tnum for method "
44			puts "$method with named in-memory databases."
45			return
46		}
47	}
48
49	set msg2 "and on-disk replication files"
50	if { $repfiles_in_memory } {
51		set msg2 "and in-memory replication files"
52	}
53
54	# Run the body of the test with and without recovery.
55	foreach r $test_recopts {
56		foreach l $logsets {
57			set logindex [lsearch -exact $l "in-memory"]
58			if { $r == "-recover" && $logindex != -1 } {
59				puts "Rep$tnum: Skipping\
60				    for in-memory logs with -recover."
61				continue
62			}
63			puts "Rep$tnum ($method $r): Replication\
64			    and openfiles $msg $msg2."
65			puts "Rep$tnum: Master logs are [lindex $l 0]"
66			puts "Rep$tnum: Client logs are [lindex $l 1]"
67			rep014_sub $method $niter $tnum $l $r $args
68		}
69	}
70}
71
72proc rep014_sub { method niter tnum logset recargs largs } {
73	global testdir
74	global databases_in_memory
75	global repfiles_in_memory
76	global rep_verbose
77	global verbose_type
78
79	set verbargs ""
80	if { $rep_verbose == 1 } {
81		set verbargs " -verbose {$verbose_type on} "
82	}
83
84	set repmemargs ""
85	if { $repfiles_in_memory } {
86		set repmemargs "-rep_inmem_files "
87	}
88
89	env_cleanup $testdir
90	set orig_tdir $testdir
91
92	replsetup $testdir/MSGQUEUEDIR
93
94	set masterdir $testdir/MASTERDIR
95	set clientdir $testdir/CLIENTDIR
96	file mkdir $masterdir
97	file mkdir $clientdir
98
99	set m_logtype [lindex $logset 0]
100	set c_logtype [lindex $logset 1]
101
102	# In-memory logs require a large log buffer, and cannot
103	# be used with -txn nosync.
104	set m_logargs [adjust_logargs $m_logtype]
105	set c_logargs [adjust_logargs $c_logtype]
106	set m_txnargs [adjust_txnargs $m_logtype]
107	set c_txnargs [adjust_txnargs $c_logtype]
108
109	# Open a master.
110	repladd 1
111	set ma_envcmd "berkdb_env_noerr -create $m_txnargs $m_logargs \
112	    $verbargs -errpfx MASTER -home $masterdir $repmemargs \
113	    -rep_transport \[list 1 replsend\]"
114	set env0 [eval $ma_envcmd $recargs -rep_master]
115	set masterenv $env0
116
117	# Open a client.
118	repladd 2
119	set cl_envcmd "berkdb_env_noerr -create $c_txnargs $c_logargs \
120	    $verbargs -errpfx CLIENT1 -home $clientdir $repmemargs \
121	    -rep_transport \[list 2 replsend\]"
122	set env1 [eval $cl_envcmd $recargs]
123	error_check_good client_env [is_valid_env $env1] TRUE
124	set env2 [eval $cl_envcmd]
125	error_check_good client_env [is_valid_env $env2] TRUE
126
127	error_check_good e1_cl [$env1 rep_start -client] 0
128
129	# Set up databases for in-memory or on-disk.
130	if { $databases_in_memory } {
131		set testfile { "" "test.db" }
132	} else {
133		set testfile "test.db"
134	}
135
136	set omethod [convert_method $method]
137	set env0db [eval {berkdb_open_noerr -env $env0 -auto_commit \
138	     -create -mode 0644} $largs $omethod $testfile]
139	set masterdb $env0db
140	error_check_good dbopen [is_valid_db $env0db] TRUE
141
142	# Bring the clients online by processing the startup messages.
143	set envlist "{$env0 1} {$env1 2}"
144	process_msgs $envlist
145
146	# Run a modified test001 in the master (and update clients).
147	puts "\tRep$tnum.a: Running test001 in replicated env."
148	eval rep_test $method $masterenv $masterdb $niter 0 0 0 $largs
149	process_msgs $envlist
150
151	puts "\tRep$tnum.b: Close and reopen client env."
152	error_check_good env1_close [$env1 close] 0
153	set env1 [eval $cl_envcmd]
154	error_check_good client_env [is_valid_env $env1] TRUE
155	error_check_good e1_cl [$env1 rep_start -client] 0
156
157	puts "\tRep$tnum.c: Run test in master again."
158	set start $niter
159	eval rep_test $method $masterenv $masterdb $niter $start 0 0 $largs
160	set envlist "{$env0 1} {$env1 2}"
161	process_msgs $envlist
162
163	puts "\tRep$tnum.d: Start and close 2nd client env."
164	error_check_good e2_pfx [$env2 errpfx CLIENT2] 0
165	error_check_good e2_cl [$env2 rep_start -client] 0
166	error_check_good env2_close [$env2 close] 0
167
168	puts "\tRep$tnum.e: Run test in master again."
169	set start [expr $start + $niter]
170	error_check_good e1_pfx [$env1 errpfx CLIENT1] 0
171	eval rep_test $method $masterenv $masterdb $niter $start 0 0 $largs
172	process_msgs $envlist
173
174	puts "\tRep$tnum.f: Open env2, close env1, use env2."
175	set env2 [eval $cl_envcmd]
176	error_check_good client_env [is_valid_env $env2] TRUE
177	error_check_good e1_pfx [$env2 errpfx CLIENT2] 0
178	error_check_good e2_cl [$env2 rep_start -client] 0
179	error_check_good e1_pfx [$env1 errpfx CLIENT1] 0
180
181	# Check for on-disk or in-memory while we have all 3 envs.
182	check_db_location $masterenv
183	check_db_location $env1
184	check_db_location $env2
185
186	error_check_good env1_close [$env1 close] 0
187
188	puts "\tRep$tnum.g: Run test in master again."
189	set start [expr $start + $niter]
190	error_check_good e1_pfx [$env2 errpfx CLIENT2] 0
191	eval rep_test $method $masterenv $masterdb $niter $start 0 0 $largs
192	set envlist "{$env0 1} {$env2 2}"
193	process_msgs $envlist
194
195	puts "\tRep$tnum.h: Closing"
196	error_check_good env0db [$env0db close] 0
197	error_check_good env0_close [$env0 close] 0
198	error_check_good env2_close [$env2 close] 0
199	replclose $testdir/MSGQUEUEDIR
200	set testdir $orig_tdir
201	return
202}
203