1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 2001-2009 Oracle.  All rights reserved.
4#
5# $Id$
6#
7# TEST  rep048
8# TEST	Replication and log gap bulk transfers.
9# TEST	Have two master env handles.  Turn bulk on in
10# TEST	one (turns it on for both).  Turn it off in the other.
11# TEST	While toggling, send log records from both handles.
12# TEST	Process message and verify master and client match.
13#
14proc rep048 { method { nentries 3000 } { tnum "048" } args } {
15	source ./include.tcl
16	global databases_in_memory
17	global repfiles_in_memory
18
19	if { $checking_valid_methods } {
20		return "ALL"
21	}
22
23	set args [convert_args $method $args]
24	set logsets [create_logsets 2]
25
26	# Set up for on-disk or in-memory databases.
27	set msg "using on-disk databases"
28	if { $databases_in_memory } {
29		set msg "using named in-memory databases"
30		if { [is_queueext $method] } {
31			puts -nonewline "Skipping rep$tnum for method "
32			puts "$method with named in-memory databases."
33			return
34		}
35	}
36
37	set msg2 "and on-disk replication files"
38	if { $repfiles_in_memory } {
39		set msg2 "and in-memory replication files"
40	}
41
42	# Run the body of the test with and without recovery.
43	foreach r $test_recopts {
44		foreach l $logsets {
45			set logindex [lsearch -exact $l "in-memory"]
46			if { $r == "-recover" && $logindex != -1 } {
47				puts "Skipping test with -recover for \
48				    in-memory logs."
49				continue
50			}
51			puts "Rep$tnum ($method $r): Replication\
52			    and toggling bulk transfer $msg $msg2."
53			puts "Rep$tnum: Master logs are [lindex $l 0]"
54			puts "Rep$tnum: Client logs are [lindex $l 1]"
55			rep048_sub $method $nentries $tnum $l $r $args
56		}
57	}
58}
59
60proc rep048_sub { method niter tnum logset recargs largs } {
61	source ./include.tcl
62	global overflowword1
63	global overflowword2
64	global databases_in_memory
65	global repfiles_in_memory
66	global rep_verbose
67	global verbose_type
68
69	set verbargs ""
70	if { $rep_verbose == 1 } {
71		set verbargs " -verbose {$verbose_type on} "
72	}
73
74	set repmemargs ""
75	if { $repfiles_in_memory } {
76		set repmemargs "-rep_inmem_files "
77	}
78
79	set orig_tdir $testdir
80	env_cleanup $testdir
81
82	replsetup $testdir/MSGQUEUEDIR
83	set overflowword1 "0"
84	set overflowword2 "0"
85
86	set masterdir $testdir/MASTERDIR
87	set clientdir $testdir/CLIENTDIR
88	file mkdir $clientdir
89	file mkdir $masterdir
90
91	set m_logtype [lindex $logset 0]
92	set c_logtype [lindex $logset 1]
93
94	set in_memory_log \
95	    [expr { $m_logtype == "in-memory" || $c_logtype == "in-memory" }]
96
97	# In-memory logs require a large log buffer, and can not
98	# be used with -txn nosync.  Adjust the args for master
99	# and client.
100	# This test has a long transaction, allocate a larger log
101	# buffer for in-memory test.
102	set m_logargs [adjust_logargs $m_logtype [expr 20 * 1024 * 1024]]
103	set c_logargs [adjust_logargs $c_logtype [expr 20 * 1024 * 1024]]
104	set m_txnargs [adjust_txnargs $m_logtype]
105	set c_txnargs [adjust_txnargs $c_logtype]
106
107	# Open a master.
108	repladd 1
109	set ma_envcmd "berkdb_env_noerr -create $m_txnargs $m_logargs \
110	    -errpfx MASTER $verbargs -home $masterdir $repmemargs \
111	    -rep_master -rep_transport \[list 1 replsend\]"
112	set masterenv [eval $ma_envcmd $recargs]
113	error_check_good master_env [is_valid_env $masterenv] TRUE
114
115	# Open a client.
116	repladd 2
117	set cl_envcmd "berkdb_env_noerr -create $c_txnargs $c_logargs \
118	    -errpfx CLIENT $verbargs -home $clientdir $repmemargs \
119	    -rep_client -rep_transport \[list 2 replsend\]"
120	set clientenv [eval $cl_envcmd $recargs]
121	error_check_good client_env [is_valid_env $clientenv] TRUE
122
123	# Bring the client online by processing the startup messages.
124	set envlist "{$masterenv 1} {$clientenv 2}"
125	process_msgs $envlist
126
127	puts "\tRep$tnum.a: Create and open master databases"
128	if { $databases_in_memory } {
129		set dbname { "" "test.db" }
130	} else {
131		set dbname "test.db"
132	}
133
134	set omethod [convert_method $method]
135	set masterdb [eval {berkdb_open_noerr -env $masterenv -auto_commit \
136	    -create -mode 0644} $largs $omethod $dbname]
137	error_check_good dbopen [is_valid_db $masterdb] TRUE
138
139	set scrlog $testdir/repscript.log
140	puts "\tRep$tnum.b: Fork child process."
141	set pid [exec $tclsh_path $test_path/wrap.tcl \
142	    rep048script.tcl $scrlog $masterdir $databases_in_memory &]
143
144	# Wait for child process to start up.
145	while { 1 } {
146		if { [file exists $masterdir/marker.file] == 0  } {
147			tclsleep 1
148		} else {
149			tclsleep 1
150			break
151		}
152	}
153	# Run a modified test001 in the master (and update clients).
154	# Call it several times so make sure that we get descheduled.
155	puts "\tRep$tnum.c: Basic long running txn"
156	set div 10
157	set loop [expr $niter / $div]
158	set start 0
159	for { set i 0 } { $i < $div } {incr i} {
160		rep_test_bulk $method $masterenv $masterdb $loop $start $start 0
161		process_msgs $envlist
162		set start [expr $start + $loop]
163		tclsleep 1
164	}
165	error_check_good dbclose [$masterdb close] 0
166	set marker [open $masterdir/done.file w]
167	close $marker
168
169	set bulkxfer1 [stat_field $masterenv rep_stat "Bulk buffer transfers"]
170	error_check_bad bulk $bulkxfer1 0
171
172	puts "\tRep$tnum.d: Waiting for child ..."
173	# Watch until the child is done.
174	watch_procs $pid 5
175	process_msgs $envlist
176	set childname "child.db"
177
178	rep_verify $masterdir $masterenv $clientdir $clientenv \
179	    $in_memory_log 1 1
180	rep_verify $masterdir $masterenv $clientdir $clientenv \
181	    0 1 0 $childname
182
183	error_check_good mclose [$masterenv close] 0
184	error_check_good cclose [$clientenv close] 0
185	replclose $testdir/MSGQUEUEDIR
186}
187