1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 2004,2008 Oracle.  All rights reserved.
4#
5# $Id: rep023.tcl,v 12.16 2008/01/08 20:58:53 bostic Exp $
6#
7# TEST	rep023
8# TEST	Replication using two master handles.
9# TEST
10# TEST	Open two handles on one master env.  Create two
11# TEST	databases, one through each master handle.  Process
12# TEST	all messages through the first master handle.  Make
13# TEST	sure changes made through both handles are picked
14# TEST	up properly.
15#
16proc rep023 { method { niter 10 } { tnum "023" } args } {
17
18	source ./include.tcl
19	if { $is_windows9x_test == 1 } {
20		puts "Skipping replication test on Win 9x platform."
21		return
22	}
23
24	# Run for all access methods.
25	if { $checking_valid_methods } {
26		return "ALL"
27	}
28
29	# We can't open two envs on HP-UX, so just skip the
30	# whole test since that is at the core of it.
31	if { $is_hp_test == 1 } {
32		puts "Rep$tnum: Skipping for HP-UX."
33		return
34	}
35
36	set args [convert_args $method $args]
37	set logsets [create_logsets 2]
38
39	# Run the body of the test with and without recovery, and
40	# with and without -rep_start.
41	foreach r $test_recopts {
42		foreach l $logsets {
43			set logindex [lsearch -exact $l "in-memory"]
44			if { $r == "-recover" && $logindex != -1 } {
45				puts "Rep$tnum: Skipping\
46				    for in-memory logs with -recover."
47				continue
48			}
49			foreach startopt { 0 1 } {
50				if { $startopt == 1 } {
51					set msg "with rep_start"
52				} else {
53					set msg ""
54				}
55				puts "Rep$tnum ($method $r $msg):\
56				    Replication and openfiles."
57				puts "Rep$tnum: Master logs are [lindex $l 0]"
58				puts "Rep$tnum: Client logs are [lindex $l 1]"
59				rep023_sub $method \
60				    $niter $tnum $l $r $startopt $args
61			}
62		}
63	}
64}
65
66proc rep023_sub { method niter tnum logset recargs startopt largs } {
67	global testdir
68	global rep_verbose
69	global verbose_type
70
71	set verbargs ""
72	if { $rep_verbose == 1 } {
73		set verbargs " -verbose {$verbose_type on} "
74	}
75
76	env_cleanup $testdir
77
78	replsetup $testdir/MSGQUEUEDIR
79
80	set masterdir $testdir/MASTERDIR
81	set clientdir $testdir/CLIENTDIR
82	file mkdir $masterdir
83	file mkdir $clientdir
84
85	set m_logtype [lindex $logset 0]
86	set c_logtype [lindex $logset 1]
87
88	# In-memory logs require a large log buffer, and cannot
89	# be used with -txn nosync.
90	set m_logargs [adjust_logargs $m_logtype]
91	set c_logargs [adjust_logargs $c_logtype]
92	set m_txnargs [adjust_txnargs $m_logtype]
93	set c_txnargs [adjust_txnargs $c_logtype]
94
95	# Open 1st master.
96	repladd 1
97	set ma_envcmd "berkdb_env_noerr -create $m_txnargs $m_logargs \
98	    $verbargs -errpfx MASTER -home $masterdir \
99	    -rep_transport \[list 1 replsend\]"
100	set masterenv1 [eval $ma_envcmd $recargs -rep_master]
101
102	# Open 2nd handle on master.  The master envs will share
103	# the same envid.
104	set masterenv2 [eval $ma_envcmd]
105	if { $startopt == 1 } {
106		error_check_good rep_start [$masterenv2 rep_start -master] 0
107	}
108
109	# Open a client.
110	repladd 2
111	set cl_envcmd "berkdb_env_noerr -create $c_txnargs \
112	    $c_logargs $verbargs -errpfx CLIENT -home $clientdir \
113	    -rep_transport \[list 2 replsend\]"
114	set clientenv [eval $cl_envcmd $recargs -rep_client]
115
116	# Bring the clients online by processing the startup messages.
117	# Process messages on the first masterenv handle, not the second.
118	set envlist "{$masterenv1 1} {$clientenv 2}"
119	process_msgs $envlist
120
121	puts "\tRep$tnum.a: Create database using 1st master handle."
122	# Create a database using the 1st master.
123	set testfile1 "m1$tnum.db"
124	set omethod [convert_method $method]
125	set db1 [eval {berkdb_open_noerr -env $masterenv1 -auto_commit \
126	     -create -mode 0644} $largs $omethod $testfile1]
127	error_check_good dbopen [is_valid_db $db1] TRUE
128
129	puts "\tRep$tnum.b: Create database using 2nd master handle."
130	# Create a different database using the 2nd master.
131	set testfile2 "m2$tnum.db"
132	set db2 [eval {berkdb_open_noerr -env $masterenv2 -auto_commit \
133	     -create -mode 0644} $largs $omethod $testfile2]
134	error_check_good dbopen [is_valid_db $db2] TRUE
135
136	puts "\tRep$tnum.c: Process messages."
137	# Process messages.
138	process_msgs $envlist
139
140	puts "\tRep$tnum.d: Run rep_test in 1st master; process messages."
141	eval rep_test $method $masterenv1 $db1 $niter 0 0 0 0 $largs
142	process_msgs $envlist
143
144	puts "\tRep$tnum.e: Run rep_test in 2nd master; process messages."
145	eval rep_test $method $masterenv2 $db2 $niter 0 0 0 0 $largs
146	process_msgs $envlist
147
148	# Contents of the two databases should match.
149	error_check_good db_compare [db_compare \
150	    $db1 $db2 $masterdir/$testfile1 $masterdir/$testfile2] 0
151
152	puts "\tRep$tnum.f: Close 2nd master."
153	error_check_good db2 [$db2 close] 0
154	error_check_good master2_close [$masterenv2 close] 0
155
156	puts "\tRep$tnum.g: Run test in master again."
157	eval rep_test $method $masterenv1 $db1 $niter $niter 0 0 0 $largs
158	process_msgs $envlist
159
160	puts "\tRep$tnum.h: Closing"
161	error_check_good db1 [$db1 close] 0
162	error_check_good env0_close [$masterenv1 close] 0
163	error_check_good env2_close [$clientenv close] 0
164	replclose $testdir/MSGQUEUEDIR
165	return
166}
167