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