1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 1996-2009 Oracle.  All rights reserved.
4#
5# $Id$
6#
7# TEST	log002
8# TEST	Tests multiple logs
9# TEST		Log truncation
10# TEST		LSN comparison and file functionality.
11proc log002 { } {
12	global rand_init
13	error_check_good set_random_seed [berkdb srand $rand_init] 0
14
15	foreach inmem { 1 0 } {
16		log002_body $inmem
17	}
18}
19
20proc log002_body { inmem } {
21	source ./include.tcl
22
23	puts "Log002: Multiple log test w/trunc, file, compare functionality"
24
25	env_cleanup $testdir
26
27	set max [expr 1024 * 128]
28
29	set logargs ""
30	if { $inmem == 0 } {
31		puts "Log002: Using on-disk logging."
32	} else {
33		puts "Log002: Using in-memory logging."
34		set lbuf [expr 8 * [expr 1024 * 1024]]
35		set logargs "-log_inmemory -log_buffer $lbuf"
36	}
37	set env [eval {berkdb_env} -create -home $testdir -log \
38	    -mode 0644 $logargs -log_max $max]
39	error_check_good envopen [is_valid_env $env] TRUE
40
41	# We'll record every hundredth record for later use
42	set info_list {}
43
44	puts "\tLog002.a: Writing log records"
45	set i 0
46	for {set s 0} { $s <  [expr 3 * $max] } { incr s $len } {
47		set rec [random_data 120 0 0]
48		set len [string length $rec]
49		set lsn [$env log_put $rec]
50
51		if { [expr $i % 100 ] == 0 } {
52			lappend info_list [list $lsn $rec]
53		}
54		incr i
55	}
56
57	puts "\tLog002.b: Checking log_compare"
58	set last {0 0}
59	foreach p $info_list {
60		set l [lindex $p 0]
61		if { [llength $last] != 0 } {
62			error_check_good \
63			    log_compare [$env log_compare $l $last] 1
64			error_check_good \
65			    log_compare [$env log_compare $last $l] -1
66			error_check_good \
67			    log_compare [$env log_compare $l $l] 0
68		}
69		set last $l
70	}
71
72	puts "\tLog002.c: Checking log_file"
73	if { $inmem == 0 } {
74		set flist [glob $testdir/log*]
75		foreach p $info_list {
76			set lsn [lindex $p 0]
77			set f [$env log_file $lsn]
78
79			# Change backslash separators on Windows to forward
80			# slashes, as the rest of the test suite expects.
81			regsub -all {\\} $f {/} f
82			error_check_bad log_file:$f [lsearch $flist $f] -1
83		}
84	}
85
86	puts "\tLog002.d: Verifying records"
87
88	set logc [$env log_cursor]
89	error_check_good log_cursor [is_valid_logc $logc $env] TRUE
90
91	for {set i [expr [llength $info_list] - 1] } { $i >= 0 } { incr i -1} {
92		set p [lindex $info_list $i]
93		set grec [$logc get -set [lindex $p 0]]
94		error_check_good log_get:$env [lindex $grec 1] [lindex $p 1]
95	}
96
97	# Close and unlink the file
98	error_check_good log_cursor:close:$logc [$logc close] 0
99	error_check_good env:close [$env close] 0
100	error_check_good envremove [berkdb envremove -home $testdir] 0
101}
102