1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 2004,2008 Oracle.  All rights reserved.
4#
5# $Id: rep027.tcl,v 12.15 2008/01/08 20:58:53 bostic Exp $
6#
7# TEST	rep027
8# TEST	Replication and secondary indexes.
9# TEST
10# TEST	Set up a secondary index on the master and make sure
11# TEST 	it can be accessed from the client.
12
13proc rep027 { method { niter 1000 } { tnum "027" } args } {
14
15	source ./include.tcl
16	if { $is_windows9x_test == 1 } {
17		puts "Skipping replication test on Win 9x platform."
18		return
19	}
20
21	# Renumbering recno is not permitted on a primary database.
22	if { $checking_valid_methods } {
23		set test_methods {}
24		foreach method $valid_methods {
25			if { [is_rrecno $method] != 1 } {
26				lappend test_methods $method
27			}
28		}
29		return $test_methods
30	}
31	if { [is_rrecno $method] == 1 } {
32		puts "Skipping rep027 for -rrecno."
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.
40	foreach r $test_recopts {
41		foreach l $logsets {
42			set logindex [lsearch -exact $l "in-memory"]
43			if { $r == "-recover" && $logindex != -1 } {
44				puts "Rep$tnum: Skipping\
45				    for in-memory logs with -recover."
46				continue
47			}
48			puts "Rep$tnum ($method $r):\
49			    Replication and secondary indices"
50			puts "Rep$tnum: Master logs are [lindex $l 0]"
51			puts "Rep$tnum: Client logs are [lindex $l 1]"
52			rep027_sub $method $niter $tnum $l $r $args
53		}
54	}
55}
56
57proc rep027_sub { method niter tnum logset recargs largs } {
58	source ./include.tcl
59	global verbose_check_secondaries
60	global rep_verbose
61	global verbose_type
62
63	set verbargs ""
64	if { $rep_verbose == 1 } {
65		set verbargs " -verbose {$verbose_type on} "
66	}
67
68	set omethod [convert_method $method]
69	env_cleanup $testdir
70
71	replsetup $testdir/MSGQUEUEDIR
72
73	set masterdir $testdir/MASTERDIR
74	set clientdir $testdir/CLIENTDIR
75
76	file mkdir $masterdir
77	file mkdir $clientdir
78
79	set m_logtype [lindex $logset 0]
80	set c_logtype [lindex $logset 1]
81
82	# In-memory logs require a large log buffer, and cannot
83	# be used with -txn nosync.
84	set m_logargs [adjust_logargs $m_logtype]
85	set c_logargs [adjust_logargs $c_logtype]
86	set m_txnargs [adjust_txnargs $m_logtype]
87	set c_txnargs [adjust_txnargs $c_logtype]
88
89	# Open a master.
90	repladd 1
91	set env_cmd(M) "berkdb_env_noerr -create $verbargs \
92	    -log_max 1000000 -home $masterdir -errpfx MASTER \
93	    $m_txnargs $m_logargs -rep_master -rep_transport \
94	    \[list 1 replsend\]"
95	set masterenv [eval $env_cmd(M) $recargs]
96
97	# Open a client
98	repladd 2
99	set env_cmd(C) "berkdb_env_noerr -create $verbargs \
100	    $c_txnargs $c_logargs -home $clientdir -errpfx CLIENT \
101	    -rep_client -rep_transport \[list 2 replsend\]"
102	set clientenv [eval $env_cmd(C) $recargs]
103
104	# Bring the client online by processing the startup messages.
105	set envlist "{$masterenv 1} {$clientenv 2}"
106	process_msgs $envlist
107
108	# Set up database and secondary index on master.
109	puts "\tRep$tnum.a: Set up database with secondary index."
110	set pname "primary$tnum.db"
111	set sname "secondary$tnum.db"
112
113	# Open the primary.
114	set pdb [eval {berkdb_open_noerr -create \
115	    -auto_commit -env} $masterenv $omethod $largs $pname]
116	error_check_good primary_open [is_valid_db $pdb] TRUE
117	process_msgs $envlist
118
119	# Open and associate a secondary.
120	set sdb [eval {berkdb_open_noerr -create \
121	    -auto_commit -env} $masterenv -btree $sname]
122	error_check_good second_open [is_valid_db $sdb] TRUE
123	error_check_good db_associate [$pdb associate [callback_n 0] $sdb] 0
124
125	# Propagate to client.
126	process_msgs $envlist
127
128	# Put some data in the master.
129	set did [open $dict]
130	for { set n 0 } { [gets $did str] != -1 && $n < $niter } { incr n } {
131		if { [is_record_based $method] == 1 } {
132			set key [expr $n + 1]
133			set datum $str
134		} else {
135			set key $str
136			gets $did datum
137		}
138		set keys($n) $key
139		set data($n) [pad_data $method $datum]
140
141		set ret [$pdb put $key [chop_data $method $datum]]
142		error_check_good put($n) $ret 0
143	}
144	close $did
145	process_msgs $envlist
146
147	# Check secondaries on master.
148	set verbose_check_secondaries 1
149	puts "\tRep$tnum.b: Check secondaries on master."
150	check_secondaries $pdb $sdb $niter keys data "Rep$tnum.b"
151	error_check_good pdb_close [$pdb close] 0
152	error_check_good sdb_close [$sdb close] 0
153	process_msgs $envlist
154
155	# Get handles on primary and secondary db on client.
156	set clientpdb [eval {berkdb_open -auto_commit -env} $clientenv $pname]
157	error_check_good client_pri [is_valid_db $clientpdb] TRUE
158	set clientsdb [eval {berkdb_open -auto_commit -env} $clientenv $sname]
159	error_check_good client_sec [is_valid_db $clientsdb] TRUE
160	error_check_good client_associate \
161	    [$clientpdb associate [callback_n 0] $clientsdb] 0
162
163	# Check secondaries on client.
164	puts "\tRep$tnum.c: Check secondaries on client."
165	check_secondaries $clientpdb $clientsdb $niter keys data "Rep$tnum.c"
166
167	# Clean up.
168	error_check_good clientpdb_close [$clientpdb close] 0
169	error_check_good clientsdb_close [$clientsdb close] 0
170	error_check_good masterenv_close [$masterenv close] 0
171	error_check_good clientenv_close [$clientenv close] 0
172
173	error_check_good verify \
174	    [verify_dir $clientdir "\tRep$tnum.e: " 0 0 1] 0
175	replclose $testdir/MSGQUEUEDIR
176}
177