1# See the file LICENSE for redistribution information. 2# 3# Copyright (c) 2001,2008 Oracle. All rights reserved. 4# 5# $Id: rpc003.tcl,v 12.7 2008/01/08 20:58:53 bostic Exp $ 6# 7# TEST rpc003 8# TEST Test RPC and secondary indices. 9proc rpc003 { } { 10 source ./include.tcl 11 global dict nsecondaries 12 global rpc_svc 13 14 # 15 # First set up the files. Secondary indices only work readonly 16 # over RPC. So we need to create the databases first without 17 # RPC. Then run checking over RPC. 18 # 19 puts "Rpc003: Secondary indices over RPC" 20 puts "Rpc003: Using $rpc_svc" 21 if { [string compare $rpc_server "localhost"] != 0 } { 22 puts "Cannot run to non-local RPC server. Skipping." 23 return 24 } 25 cleanup $testdir NULL 26 puts "\tRpc003.a: Creating local secondary index databases" 27 28 # Primary method/args. 29 set pmethod btree 30 set pomethod [convert_method $pmethod] 31 set pargs "" 32 set methods {dbtree dbtree} 33 set argses [convert_argses $methods ""] 34 set omethods [convert_methods $methods] 35 36 set nentries 500 37 38 puts "\tRpc003.b: ($pmethod/$methods) $nentries equal key/data pairs" 39 set pname "primary003.db" 40 set snamebase "secondary003" 41 42 # Open an environment 43 # XXX if one is not supplied! 44 set env [berkdb_env -create -home $testdir] 45 error_check_good env_open [is_valid_env $env] TRUE 46 47 # Open the primary. 48 set pdb [eval {berkdb_open -create -env} $env $pomethod $pargs $pname] 49 error_check_good primary_open [is_valid_db $pdb] TRUE 50 51 # Open and associate the secondaries 52 set sdbs {} 53 for { set i 0 } { $i < [llength $omethods] } { incr i } { 54 set sdb [eval {berkdb_open -create -env} $env \ 55 [lindex $omethods $i] [lindex $argses $i] $snamebase.$i.db] 56 error_check_good second_open($i) [is_valid_db $sdb] TRUE 57 58 error_check_good db_associate($i) \ 59 [$pdb associate [callback_n $i] $sdb] 0 60 lappend sdbs $sdb 61 } 62 63 set did [open $dict] 64 for { set n 0 } { [gets $did str] != -1 && $n < $nentries } { incr n } { 65 if { [is_record_based $pmethod] == 1 } { 66 set key [expr $n + 1] 67 set datum $str 68 } else { 69 set key $str 70 gets $did datum 71 } 72 set keys($n) $key 73 set data($n) [pad_data $pmethod $datum] 74 75 set ret [eval {$pdb put} {$key [chop_data $pmethod $datum]}] 76 error_check_good put($n) $ret 0 77 } 78 close $did 79 foreach sdb $sdbs { 80 error_check_good secondary_close [$sdb close] 0 81 } 82 error_check_good primary_close [$pdb close] 0 83 error_check_good env_close [$env close] 0 84 85 # 86 # We have set up our databases, so now start the server and 87 # read them over RPC. 88 # 89 set dpid [rpc_server_start] 90 puts "\tRpc003.c: Started server, pid $dpid" 91 92 # 93 # Wrap the remainder of the test in a catch statement so we 94 # can still kill the rpc server even if the test fails. 95 # 96 set status [catch { 97 tclsleep 2 98 set home [file tail $rpc_testdir] 99 set env [eval {berkdb_env_noerr -create -mode 0644 \ 100 -home $home -server $rpc_server}] 101 error_check_good lock_env:open [is_valid_env $env] TRUE 102 103 # 104 # Attempt to send in a NULL callback to associate. It will 105 # fail if the primary and secondary are not both read-only. 106 # 107 set msg "\tRpc003.d" 108 puts "$msg: Using r/w primary and r/w secondary" 109 set popen "berkdb_open_noerr -env $env $pomethod $pargs $pname" 110 set sopen "berkdb_open_noerr -create -env $env \ 111 [lindex $omethods 0] [lindex $argses 0] $snamebase.0.db" 112 rpc003_assoc_err $popen $sopen $msg 113 114 set msg "\tRpc003.e" 115 puts "$msg: Using r/w primary and read-only secondary" 116 set popen "berkdb_open_noerr -env $env $pomethod $pargs $pname" 117 set sopen "berkdb_open_noerr -env $env -rdonly \ 118 [lindex $omethods 0] [lindex $argses 0] $snamebase.0.db" 119 rpc003_assoc_err $popen $sopen $msg 120 121 set msg "\tRpc003.f" 122 puts "$msg: Using read-only primary and r/w secondary" 123 set popen "berkdb_open_noerr -env $env \ 124 $pomethod -rdonly $pargs $pname" 125 set sopen "berkdb_open_noerr -create -env $env \ 126 [lindex $omethods 0] [lindex $argses 0] $snamebase.0.db" 127 rpc003_assoc_err $popen $sopen $msg 128 129 # Open and associate the secondaries 130 puts "\tRpc003.g: Checking secondaries, both read-only" 131 set pdb [eval {berkdb_open_noerr -env} $env \ 132 -rdonly $pomethod $pargs $pname] 133 error_check_good primary_open2 [is_valid_db $pdb] TRUE 134 135 set sdbs {} 136 for { set i 0 } { $i < [llength $omethods] } { incr i } { 137 set sdb [eval {berkdb_open -env} $env -rdonly \ 138 [lindex $omethods $i] [lindex $argses $i] \ 139 $snamebase.$i.db] 140 error_check_good second_open2($i) \ 141 [is_valid_db $sdb] TRUE 142 error_check_good db_associate2($i) \ 143 [eval {$pdb associate} "" $sdb] 0 144 lappend sdbs $sdb 145 } 146 check_secondaries $pdb $sdbs $nentries keys data "Rpc003.h" 147 148 foreach sdb $sdbs { 149 error_check_good secondary_close [$sdb close] 0 150 } 151 error_check_good primary_close [$pdb close] 0 152 error_check_good env_close [$env close] 0 153 } res] 154 if { $status != 0 } { 155 puts $res 156 } 157 tclkill $dpid 158} 159 160proc rpc003_assoc_err { popen sopen msg } { 161 global rpc_svc 162 163 set pdb [eval $popen] 164 error_check_good assoc_err_popen [is_valid_db $pdb] TRUE 165 166 puts "$msg.0: NULL callback" 167 set sdb [eval $sopen] 168 error_check_good assoc_err_sopen [is_valid_db $sdb] TRUE 169 set stat [catch {eval {$pdb associate} "" $sdb} ret] 170 error_check_good db_associate:rdonly $stat 1 171 error_check_good db_associate:inval [is_substr $ret invalid] 1 172 173 # The Java and JE RPC servers support callbacks. 174 if { $rpc_svc == "berkeley_db_svc" || \ 175 $rpc_svc == "berkeley_db_cxxsvc" } { 176 puts "$msg.1: non-NULL callback" 177 set stat [catch {eval $pdb associate [callback_n 0] $sdb} ret] 178 error_check_good db_associate:callback $stat 1 179 error_check_good db_associate:inval [is_substr $ret invalid] 1 180 } 181 182 error_check_good assoc_sclose [$sdb close] 0 183 error_check_good assoc_pclose [$pdb close] 0 184} 185