Commit 235123b4 authored by Dave Wells's avatar Dave Wells Committed by Yoni Fogel

merge fixes from tokudb.2384

git-svn-id: file:///svn/toku/tokudb@18039 c7de825b-a66e-492c-adef-691d508d4ae1
parent 1c7b2bce
...@@ -48,6 +48,13 @@ static int lc_close_cur_logfile(TOKULOGCURSOR lc) { ...@@ -48,6 +48,13 @@ static int lc_close_cur_logfile(TOKULOGCURSOR lc) {
} }
return 0; return 0;
} }
static off_t lc_file_len(const char *name) {
toku_struct_stat buf;
int r = toku_stat(name, &buf); assert(r == 0);
return buf.st_size;
}
static int lc_open_logfile(TOKULOGCURSOR lc, int index) { static int lc_open_logfile(TOKULOGCURSOR lc, int index) {
int r=0; int r=0;
assert( !lc->is_open ); assert( !lc->is_open );
...@@ -60,13 +67,15 @@ static int lc_open_logfile(TOKULOGCURSOR lc, int index) { ...@@ -60,13 +67,15 @@ static int lc_open_logfile(TOKULOGCURSOR lc, int index) {
r = setvbuf(lc->cur_fp, lc->buffer, _IOFBF, lc->buffer_size); r = setvbuf(lc->cur_fp, lc->buffer, _IOFBF, lc->buffer_size);
assert(r == 0); assert(r == 0);
#endif #endif
// position fp past header // position fp past header, ignore 0 length file (t:2384)
unsigned int version=0; unsigned int version=0;
if ( lc_file_len(lc->logfiles[index]) >= 12 ) {
r = toku_read_logmagic(lc->cur_fp, &version); r = toku_read_logmagic(lc->cur_fp, &version);
if (r!=0) if (r!=0)
return DB_BADFORMAT; return DB_BADFORMAT;
if (version != TOKU_LOG_VERSION) if (version != TOKU_LOG_VERSION)
return DB_BADFORMAT; return DB_BADFORMAT;
}
// mark as open // mark as open
lc->is_open = TRUE; lc->is_open = TRUE;
return r; return r;
......
...@@ -88,6 +88,7 @@ REGRESSION_TESTS_RAW = \ ...@@ -88,6 +88,7 @@ REGRESSION_TESTS_RAW = \
logcursor-empty-logdir \ logcursor-empty-logdir \
logcursor-empty-logfile \ logcursor-empty-logfile \
logcursor-empty-logfile-2 \ logcursor-empty-logfile-2 \
logcursor-empty-logfile-3 \
memtest \ memtest \
minicron-test \ minicron-test \
omt-cursor-test \ omt-cursor-test \
......
/* -*- mode: C; c-basic-offset: 4 -*- */
#ident "Copyright (c) 2007, 2008 Tokutek Inc. All rights reserved."
#include "test.h"
#include "includes.h"
const int N = 2;
#define dname __FILE__ ".dir"
#define rmrf "rm -rf " dname "/"
int
test_main (int argc, const char *argv[]) {
default_parse_args(argc, argv);
int r;
system(rmrf);
r = toku_os_mkdir(dname, S_IRWXU); assert(r==0);
TOKULOGGER logger;
LSN lsn = ZERO_LSN;
int helloseq = 0;
// create N log files with a hello message
for (int i=0; i<N; i++) {
r = toku_logger_create(&logger);
assert(r == 0);
r = toku_logger_open(dname, logger);
assert(r == 0);
char str[32];
sprintf(str, "hello%d", helloseq++);
BYTESTRING bs0 = { .data = str, .len = strlen(str) };
r = toku_log_comment(logger, &lsn, 0, 0, bs0);
assert(r == 0);
r = toku_logger_close(&logger);
assert(r == 0);
}
// create N empty log files
for (int i=0; i<N; i++) {
r = toku_logger_create(&logger);
assert(r == 0);
r = toku_logger_open(dname, logger);
assert(r == 0);
r = toku_logger_close(&logger);
assert(r == 0);
}
// CREATE AN EMPTY FILE (tests [t:2384])
{
long long nexti;
r = toku_logger_find_next_unused_log_file(dname, &nexti);
assert(r == 0);
char mt_fname[128];
snprintf(mt_fname, 128, "%s/log%012lld.tokulog", dname, nexti);
int mt_fd = open(mt_fname, O_CREAT+O_WRONLY+O_TRUNC+O_EXCL+O_BINARY, S_IRWXU);
assert(mt_fd != -1);
r = close(mt_fd);
}
// create N log files with a hello message
for (int i=0; i<N; i++) {
r = toku_logger_create(&logger);
assert(r == 0);
r = toku_logger_open(dname, logger);
assert(r == 0);
char str[32];
sprintf(str, "hello%d", helloseq++);
BYTESTRING bs0 = { .data = str, .len = strlen(str) };
r = toku_log_comment(logger, &lsn, 0, 0, bs0);
assert(r == 0);
r = toku_logger_close(&logger);
assert(r == 0);
}
// CREATE AN EMPTY FILE (tests [t:2384])
{
long long nexti;
r = toku_logger_find_next_unused_log_file(dname, &nexti);
assert(r == 0);
char mt_fname[128];
snprintf(mt_fname, 128, "%s/log%012lld.tokulog", dname, nexti);
int mt_fd = open(mt_fname, O_CREAT+O_WRONLY+O_TRUNC+O_EXCL+O_BINARY, S_IRWXU);
assert(mt_fd != -1);
r = close(mt_fd);
}
// verify the log forwards
TOKULOGCURSOR lc = NULL;
struct log_entry *le;
r = toku_logcursor_create(&lc, dname);
assert(r == 0 && lc != NULL);
helloseq = 0;
for (int i=0; i<2*N; i++) {
r = toku_logcursor_next(lc, &le);
assert(r == 0 && le->cmd == LT_comment);
char expect[32];
sprintf(expect, "hello%d", helloseq++);
assert(le->u.comment.comment.len == strlen(expect) && memcmp(le->u.comment.comment.data, expect, le->u.comment.comment.len) == 0);
}
r = toku_logcursor_next(lc, &le);
assert(r != 0);
r = toku_logcursor_destroy(&lc);
assert(r == 0 && lc == NULL);
// verify the log backwards
r = toku_logcursor_create(&lc, dname);
assert(r == 0 && lc != NULL);
helloseq = 2*N;
for (int i=0; i<2*N; i++) {
r = toku_logcursor_prev(lc, &le);
assert(r == 0 && le->cmd == LT_comment);
char expect[32];
sprintf(expect, "hello%d", --helloseq);
assert(le->u.comment.comment.len == strlen(expect) && memcmp(le->u.comment.comment.data, expect, le->u.comment.comment.len) == 0);
}
r = toku_logcursor_prev(lc, &le);
assert(r != 0);
r = toku_logcursor_destroy(&lc);
assert(r == 0 && lc == NULL);
// VERIFY TRIM WORKS WITH ZERO LENGTH FILE [t:2384]
{
LSN trim_lsn;
trim_lsn.lsn = (2*N)-1;
r = toku_logger_create(&logger); assert(r==0);
r = toku_logger_open(dname, logger); assert(r==0);
r = toku_logger_maybe_trim_log(logger, trim_lsn);
assert( toku_logfilemgr_num_logfiles(logger->logfilemgr) == 3 ); // untrimmed log, empty log, plus newly openned log
r = toku_logger_close(&logger);
}
return 0;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment