1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 2001,2008 Oracle.  All rights reserved.
4#
5# $Id: rep048.tcl,v 12.16 2008/01/08 20:58:53 bostic Exp $
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
17	if { $checking_valid_methods } {
18		return "ALL"
19	}
20
21	set args [convert_args $method $args]
22	set logsets [create_logsets 2]
23
24	# Run the body of the test with and without recovery.
25	foreach r $test_recopts {
26		foreach l $logsets {
27			set logindex [lsearch -exact $l "in-memory"]
28			if { $r == "-recover" && $logindex != -1 } {
29				puts "Skipping test with -recover for \
30				    in-memory logs."
31				continue
32			}
33			puts "Rep$tnum ($method $r):\
34			    Replication and toggling bulk transfer."
35			puts "Rep$tnum: Master logs are [lindex $l 0]"
36			puts "Rep$tnum: Client logs are [lindex $l 1]"
37			rep048_sub $method $nentries $tnum $l $r $args
38		}
39	}
40}
41
42proc rep048_sub { method niter tnum logset recargs largs } {
43	source ./include.tcl
44	global overflowword1
45	global overflowword2
46	global rep_verbose
47	global verbose_type
48
49	set verbargs ""
50	if { $rep_verbose == 1 } {
51		set verbargs " -verbose {$verbose_type on} "
52	}
53
54	set orig_tdir $testdir
55	env_cleanup $testdir
56
57	replsetup $testdir/MSGQUEUEDIR
58	set overflowword1 "0"
59	set overflowword2 "0"
60
61	set masterdir $testdir/MASTERDIR
62	set clientdir $testdir/CLIENTDIR
63	file mkdir $clientdir
64	file mkdir $masterdir
65
66	set m_logtype [lindex $logset 0]
67	set c_logtype [lindex $logset 1]
68
69	set in_memory_log \
70	    [expr { $m_logtype == "in-memory" || $c_logtype == "in-memory" }]
71
72	# In-memory logs require a large log buffer, and can not
73	# be used with -txn nosync.  Adjust the args for master
74	# and client.
75	# This test has a long transaction, allocate a larger log
76	# buffer for in-memory test.
77	set m_logargs [adjust_logargs $m_logtype [expr 20 * 1024 * 1024]]
78	set c_logargs [adjust_logargs $c_logtype [expr 20 * 1024 * 1024]]
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	    -errpfx MASTER $verbargs -home $masterdir \
86	    -rep_master -rep_transport \[list 1 replsend\]"
87	set masterenv [eval $ma_envcmd $recargs]
88	error_check_good master_env [is_valid_env $masterenv] TRUE
89
90	# Open a client.
91	repladd 2
92	set cl_envcmd "berkdb_env_noerr -create $c_txnargs $c_logargs \
93	    -errpfx CLIENT $verbargs -home $clientdir \
94	    -rep_client -rep_transport \[list 2 replsend\]"
95	set clientenv [eval $cl_envcmd $recargs]
96	error_check_good client_env [is_valid_env $clientenv] TRUE
97
98	# Bring the client online by processing the startup messages.
99	set envlist "{$masterenv 1} {$clientenv 2}"
100	process_msgs $envlist
101
102	puts "\tRep$tnum.a: Create and open master databases"
103	set testfile "test$tnum.db"
104	set omethod [convert_method $method]
105	set masterdb [eval {berkdb_open_noerr -env $masterenv -auto_commit \
106	    -create -mode 0644} $largs $omethod $testfile]
107	error_check_good dbopen [is_valid_db $masterdb] TRUE
108
109	set scrlog $testdir/repscript.log
110	puts "\tRep$tnum.b: Fork child process."
111	set pid [exec $tclsh_path $test_path/wrap.tcl \
112	    rep048script.tcl $scrlog \
113	    $masterdir &]
114
115	# Wait for child process to start up.
116	while { 1 } {
117		if { [file exists $masterdir/marker.file] == 0  } {
118			tclsleep 1
119		} else {
120			tclsleep 1
121			break
122		}
123	}
124	# Run a modified test001 in the master (and update clients).
125	# Call it several times so make sure that we get descheduled.
126	puts "\tRep$tnum.c: Basic long running txn"
127	set div 10
128	set loop [expr $niter / $div]
129	set start 0
130	for { set i 0 } { $i < $div } {incr i} {
131		rep_test_bulk $method $masterenv $masterdb $loop $start $start 0
132		process_msgs $envlist
133		set start [expr $start + $loop]
134		tclsleep 1
135	}
136	error_check_good dbclose [$masterdb close] 0
137	set marker [open $masterdir/done.file w]
138	close $marker
139
140	set bulkxfer1 [stat_field $masterenv rep_stat "Bulk buffer transfers"]
141	error_check_bad bulk $bulkxfer1 0
142
143	puts "\tRep$tnum.d: Waiting for child ..."
144	# Watch until the child is done.
145	watch_procs $pid 5
146	process_msgs $envlist
147	rep_verify $masterdir $masterenv $clientdir $clientenv \
148	    $in_memory_log 1 1 $testfile
149	rep_verify $masterdir $masterenv $clientdir $clientenv \
150	    0 1 0 "child.db"
151
152	error_check_good mclose [$masterenv close] 0
153	error_check_good cclose [$clientenv close] 0
154	replclose $testdir/MSGQUEUEDIR
155}
156