Imported Upstream version 5.3.21
[platform/upstream/libdb.git] / test / tcl / repmgr003.tcl
1 # See the file LICENSE for redistribution information.
2 #
3 # Copyright (c) 2010, 2012 Oracle and/or its affiliates.  All rights reserved.
4 #
5 # $Id$
6 #
7 # TEST  repmgr003
8 # TEST  Basic repmgr init test.
9 # TEST
10 # TEST  Run all combinations of the basic_repmgr_init_test.
11 # TEST
12 proc repmgr003 { {display 0} {run 1} args } {
13
14         source ./include.tcl
15         if { !$display && $is_freebsd_test == 1 } {
16                 puts "Skipping replication manager tests on FreeBSD platform."
17                 return
18         }
19
20         run_repmgr_tests init
21 }
22
23 # This is the basis for simple repmgr internal init test cases.  It starts
24 # an appointed master and two clients, processing transactions between each
25 # additional site.  Then it verifies all expected transactions are 
26 # replicated.  The following parameters control runtime options:
27 #     niter    - number of records to process
28 #     inmemdb  - put databases in-memory (0, 1)
29 #     inmemlog - put logs in-memory (0, 1)
30 #     inmemrep - put replication files in-memory (0, 1)
31 #     envprivate - put region files in-memory (0, 1)
32 #     bulk     - use bulk processing (0, 1)
33 #
34 proc basic_repmgr_init_test { niter inmemdb inmemlog \
35     inmemrep envprivate bulk args } {
36
37         source ./include.tcl
38         global rep_verbose
39         global verbose_type
40         global overflowword1
41         global overflowword2
42         global databases_in_memory
43         set overflowword1 "0"
44         set overflowword2 "0"
45         set nsites 3
46
47         if { $is_freebsd_test == 1 } {
48                 puts "Skipping basic_repmgr_init_test on FreeBSD platform."
49                 return
50         }
51
52         set method "btree"
53         set largs [convert_args $method $args]
54
55         # Set databases_in_memory for this test, preserving original value.
56         if { $inmemdb } {
57                 set restore_dbinmem $databases_in_memory
58                 set databases_in_memory 1
59         }
60
61         set verbargs ""
62         if { $rep_verbose == 1 } {
63                 set verbargs " -verbose {$verbose_type on} "
64         }
65
66         env_cleanup $testdir
67         set ports [available_ports $nsites]
68
69         set masterdir $testdir/MASTERDIR
70         set clientdir $testdir/CLIENTDIR
71         set clientdir2 $testdir/CLIENTDIR2
72
73         file mkdir $masterdir
74         file mkdir $clientdir
75         file mkdir $clientdir2
76
77         # In-memory logs require a large log buffer, and cannot
78         # be used with -txn nosync.  Adjust the args.
79         set logtype "on-disk"
80         if { $inmemlog } {
81                 set logtype "in-memory"
82         }
83
84         set logargs [adjust_logargs $logtype]
85         set txnargs [adjust_txnargs $logtype]
86
87         # Determine in-memory replication argument for environments.  Also
88         # beef up cachesize for clients because the second client will need 
89         # to catch up with a few sets of records which could build up in the 
90         # tempdb, which is in-memory in this case.
91         if { $inmemrep } {
92                 set repmemarg " -rep_inmem_files "
93                 set cachesize [expr 2 * (1024 * 1024)]
94                 set cacheargs "-cachesize { 0 $cachesize 1 }"
95         } else {
96                 set repmemarg ""
97                 set cacheargs ""
98         }
99
100         # Determine argument for region files. 
101         if { $envprivate } {
102                 set private "-private "
103         } else {
104                 set private ""
105         }
106
107         print_repmgr_headers basic_repmgr_init_test $niter $inmemdb\
108             $inmemlog $inmemrep $envprivate $bulk
109
110         # Open a master.
111         puts "\tBasic repmgr init test.a: Start a master."
112         set ma_envcmd "berkdb_env_noerr -create $verbargs $private \
113             $logargs $txnargs \
114             -errpfx MASTER -home $masterdir -rep -thread $repmemarg"
115         set masterenv [eval $ma_envcmd]
116         $masterenv repmgr -ack all \
117             -local [list 127.0.0.1 [lindex $ports 0]] \
118             -start master
119
120         puts "\tBasic repmgr init test.b: Run some transactions at master."
121         eval rep_test $method $masterenv NULL $niter 0 0 0 $largs
122
123         # Open first client
124         puts "\tBasic repmgr init test.c: Start first client."
125         set cl_envcmd "berkdb_env_noerr -create $verbargs $private \
126             $logargs $txnargs $cacheargs \
127             -errpfx CLIENT -home $clientdir -rep -thread $repmemarg"
128         set clientenv [eval $cl_envcmd]
129         $clientenv repmgr -ack all \
130             -local [list 127.0.0.1 [lindex $ports 1]] \
131             -remote [list 127.0.0.1 [lindex $ports 0]] \
132             -remote [list 127.0.0.1 [lindex $ports 2]] \
133             -start client
134         await_startup_done $clientenv
135
136         #
137         # Use of -ack all guarantees replication complete before repmgr send
138         # function returns and rep_test finishes.
139         #
140         puts "\tBasic repmgr init test.d: Run some more transactions at master."
141         if { $bulk } {
142                 error_check_good set_bulk [$masterenv rep_config {bulk on}] 0
143                 eval rep_test_bulk $method $masterenv NULL $niter 0 0 0 $largs
144
145                 # Must turn off bulk because some configs (debug_rop/wop)
146                 # generate log records when verifying databases.
147                 error_check_good set_bulk [$masterenv rep_config {bulk off}] 0
148         } else {
149                 eval rep_test $method $masterenv NULL $niter $niter 0 0 $largs
150         }
151
152         # Open second client
153         puts "\tBasic repmgr init test.e: Start second client."
154         set cl_envcmd "berkdb_env_noerr -create $verbargs $private \
155             $logargs $txnargs $cacheargs \
156             -errpfx CLIENT2 -home $clientdir2 -rep -thread $repmemarg"
157         set clientenv2 [eval $cl_envcmd]
158         $clientenv2 repmgr -ack all \
159             -local [list 127.0.0.1 [lindex $ports 2]] \
160             -remote [list 127.0.0.1 [lindex $ports 0]] \
161             -remote [list 127.0.0.1 [lindex $ports 1]] \
162             -start client
163         await_startup_done $clientenv2
164
165         puts "\tBasic repmgr init test.f: Verifying client database contents."
166         rep_verify $masterdir $masterenv $clientdir $clientenv 1 1 1
167         rep_verify $masterdir $masterenv $clientdir2 $clientenv2 1 1 1
168
169         # For in-memory replication, verify replication files not there.
170         if { $inmemrep } {
171                 puts "\tBasic repmgr init test.g:\
172                     Verify no replication files on disk."
173                 no_rep_files_on_disk $masterdir
174                 no_rep_files_on_disk $clientdir
175                 no_rep_files_on_disk $clientdir2
176         }
177
178         # For private envs, verify region files are not on disk.
179         if { $envprivate } {
180                 puts "\tBasic repmgr init test.h:\
181                     Verify no region files on disk."
182                 no_region_files_on_disk $masterdir
183                 no_region_files_on_disk $clientdir
184                 no_region_files_on_disk $clientdir2
185         }
186
187         # Restore original databases_in_memory value.
188         if { $inmemdb } {
189                 set databases_in_memory $restore_dbinmem
190         }
191
192         error_check_good client2_close [$clientenv2 close] 0
193         error_check_good client_close [$clientenv close] 0
194         error_check_good masterenv_close [$masterenv close] 0
195 }