libdb/test/tcl/repmgr001.tcl

199 lines
5.9 KiB
Tcl
Raw Normal View History

#
# See the file LICENSE for redistribution information.
#
# Copyright (c) 2010, 2011 Oracle and/or its affiliates. All rights reserved.
#
# $Id$
#
# TEST repmgr001
# TEST Basic repmgr test.
# TEST
# TEST Run all mix-and-match combinations of the basic_repmgr_test.
# TEST
proc repmgr001 { {display 0} {run 1} args } {
source ./include.tcl
if { !$display && $is_freebsd_test == 1 } {
puts "Skipping replication manager tests on FreeBSD platform."
return
}
run_repmgr_tests basic
}
# This is the basis for a number of simple repmgr test cases. It creates
# an appointed master and two clients, calls rep_test to process some records
# and verifies the resulting databases. The following parameters control
# runtime options:
# niter - number of records to process
# inmemdb - put databases in-memory (0, 1)
# inmemlog - put logs in-memory (0, 1)
# inmemrep - put replication files in-memory (0, 1)
# envprivate - put region files in-memory (0, 1)
# bulk - use bulk processing (0, 1)
#
proc basic_repmgr_test { niter inmemdb inmemlog \
inmemrep envprivate bulk args } {
source ./include.tcl
global rep_verbose
global verbose_type
global overflowword1
global overflowword2
global databases_in_memory
set overflowword1 "0"
set overflowword2 "0"
set nsites 3
if { $is_freebsd_test == 1 } {
puts "Skipping replication manager test on FreeBSD platform."
return
}
set method "btree"
set largs [convert_args $method $args]
# Set databases_in_memory for this test, preserving original value.
if { $inmemdb } {
set restore_dbinmem $databases_in_memory
set databases_in_memory 1
}
set verbargs ""
if { $rep_verbose == 1 } {
set verbargs " -verbose {$verbose_type on} "
}
env_cleanup $testdir
set ports [available_ports $nsites]
set masterdir $testdir/MASTERDIR
set clientdir $testdir/CLIENTDIR
set clientdir2 $testdir/CLIENTDIR2
file mkdir $masterdir
file mkdir $clientdir
file mkdir $clientdir2
# In-memory logs require a large log buffer, and cannot
# be used with -txn nosync. Adjust the args.
set logtype "on-disk"
if { $inmemlog } {
set logtype "in-memory"
}
set logargs [adjust_logargs $logtype]
set txnargs [adjust_txnargs $logtype]
# Determine in-memory replication argument for environments.
if { $inmemrep } {
set repmemarg "-rep_inmem_files "
} else {
set repmemarg ""
}
# Determine argument for region files (env -private).
if { $envprivate } {
set private " -private"
} else {
set private ""
}
# Call the generalized header routine.
print_repmgr_headers basic_repmgr_test $niter $inmemdb \
$inmemlog $inmemrep $envprivate $bulk
# Use different connection retry timeout values to handle any
# collisions from starting sites at the same time by retrying
# at different times.
# Open a master.
puts "\tBasic repmgr test.a: Start an appointed master."
set ma_envcmd "berkdb_env_noerr -create $logargs $verbargs \
$private \
-errpfx MASTER -home $masterdir $txnargs -rep -thread \
-lock_max_locks 10000 -lock_max_objects 10000 $repmemarg"
set masterenv [eval $ma_envcmd]
$masterenv repmgr -ack all \
-timeout {connection_retry 20000000} \
-local [list localhost [lindex $ports 0]] \
-start master
# Open first client
puts "\tBasic repmgr test.b: Start first client."
set cl_envcmd "berkdb_env_noerr -create $verbargs $logargs \
$private \
-errpfx CLIENT -home $clientdir $txnargs -rep -thread \
-lock_max_locks 10000 -lock_max_objects 10000 $repmemarg"
set clientenv [eval $cl_envcmd]
$clientenv repmgr -ack all \
-timeout {connection_retry 10000000} \
-local [list localhost [lindex $ports 1]] \
-remote [list localhost [lindex $ports 0]] \
-remote [list localhost [lindex $ports 2]] \
-start client
await_startup_done $clientenv
# Open second client
puts "\tBasic repmgr test.c: Start second client."
set cl2_envcmd "berkdb_env_noerr -create $verbargs $logargs \
$private \
-errpfx CLIENT2 -home $clientdir2 $txnargs -rep -thread \
-lock_max_locks 10000 -lock_max_objects 10000 $repmemarg"
set clientenv2 [eval $cl2_envcmd]
$clientenv2 repmgr -ack all \
-timeout {connection_retry 5000000} \
-local [list localhost [lindex $ports 2]] \
-remote [list localhost [lindex $ports 0]] \
-remote [list localhost [lindex $ports 1]] \
-start client
await_startup_done $clientenv2
#
# Use of -ack all guarantees replication complete before repmgr send
# function returns and rep_test finishes.
#
puts "\tBasic repmgr test.d: Run some transactions at master."
if { $bulk } {
# Turn on bulk processing on master.
error_check_good set_bulk [$masterenv rep_config {bulk on}] 0
eval rep_test_bulk $method $masterenv NULL $niter 0 0 0 $largs
# Must turn off bulk because some configs (debug_rop/wop)
# generate log records when verifying databases.
error_check_good set_bulk [$masterenv rep_config {bulk off}] 0
} else {
eval rep_test $method $masterenv NULL $niter 0 0 0 $largs
}
puts "\tBasic repmgr test.e: Verifying client database contents."
rep_verify $masterdir $masterenv $clientdir $clientenv 1 1 1
rep_verify $masterdir $masterenv $clientdir2 $clientenv2 1 1 1
# For in-memory replication, verify replication files not there.
if { $inmemrep } {
puts "\tBasic repmgr test.f: Verify no rep files on disk."
no_rep_files_on_disk $masterdir
no_rep_files_on_disk $clientdir
no_rep_files_on_disk $clientdir2
}
# For private envs, verify no region files on disk.
if { $envprivate } {
puts "\tBasic repmgr test.g: Verify no region files on disk."
no_region_files_on_disk $masterdir
no_region_files_on_disk $clientdir
no_region_files_on_disk $clientdir2
}
# Restore original databases_in_memory value.
if { $inmemdb } {
set databases_in_memory $restore_dbinmem
}
error_check_good client2_close [$clientenv2 close] 0
error_check_good client_close [$clientenv close] 0
error_check_good masterenv_close [$masterenv close] 0
}