diff --git a/newbrt/Makefile b/newbrt/Makefile index 2955f93b608..048383b700c 100644 --- a/newbrt/Makefile +++ b/newbrt/Makefile @@ -48,6 +48,10 @@ BINS = $(REGRESSION_TESTS) \ logdump: LDFLAGS+=-lz logdump: log-internal.h brttypes.h yerror.h log.h kv-pair.h +log_code.o: log_header.h +log_code.c log_header.h: logformat + ./logformat + libs: log.o bins: $(BINS) check: bins diff --git a/newbrt/brttypes.h b/newbrt/brttypes.h index 92744447b0e..8f1eb833f5b 100644 --- a/newbrt/brttypes.h +++ b/newbrt/brttypes.h @@ -15,6 +15,11 @@ typedef const void *bytevec; typedef long long DISKOFF; /* Offset in a disk. -1 is the NULL pointer. */ typedef long long TXNID; +typedef struct { + int len; + char *data; +} BYTESTRING; + /* Make the LSN be a struct instead of an integer so that we get better type checking. */ typedef struct __toku_lsn { u_int64_t lsn; } LSN; #define ZERO_LSN ((LSN){0}) diff --git a/newbrt/log-internal.h b/newbrt/log-internal.h index 571fd531d89..62a3fdd2f0e 100644 --- a/newbrt/log-internal.h +++ b/newbrt/log-internal.h @@ -36,3 +36,5 @@ struct tokutxn { TOKULOGGER logger; TOKUTXN parent; }; + +int tokulogger_finish (TOKULOGGER logger, struct wbuf *wbuf); diff --git a/newbrt/log.c b/newbrt/log.c index 6dcab6d1759..23734725449 100644 --- a/newbrt/log.c +++ b/newbrt/log.c @@ -133,7 +133,7 @@ int tokulogger_fsync (TOKULOGGER logger) { return 0; } -static int tokulogger_finish (TOKULOGGER logger, struct wbuf *wbuf) { +int tokulogger_finish (TOKULOGGER logger, struct wbuf *wbuf) { wbuf_int(wbuf, toku_crc32(0, wbuf->buf, wbuf->ndone)); wbuf_int(wbuf, 4+wbuf->ndone); return tokulogger_log_bytes(logger, wbuf->ndone, wbuf->buf); diff --git a/newbrt/logformat.c b/newbrt/logformat.c index ca653a33a62..b48cbbb94d3 100644 --- a/newbrt/logformat.c +++ b/newbrt/logformat.c @@ -6,9 +6,12 @@ * The struct definitions. * The Latex documentation. */ -#include <stdio.h> #include <assert.h> #include <stdarg.h> +#include <stdio.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> typedef struct field { char *type; @@ -29,7 +32,7 @@ struct logtype { const struct logtype logtypes[] = { {"fcreate", 'F', FA{{"TXNID", "txnid"}, {"BYTESTRING", "fname"}, - {"uint32", "mode"}, + {"u_int32_t", "mode"}, NULLFIELD}}, {"delete", 'D', FA{{"FILENUM", "filenum"}, {"DISKOFF", "diskoff"}, @@ -65,7 +68,7 @@ FILE *hf=0, *cf=0; void generate_lt_enum (void) { int count=0; - fprintf(hf, "enum lt_command {"); + fprintf(hf, "enum lt_cmd {"); DO_LOGTYPES(lt, ({ if (count!=0) fprintf(hf, ","); @@ -82,17 +85,15 @@ void generate_log_struct (void) { fprintf(hf, " %-16s lsn;\n", "LSN"); DO_FIELDS(ft, lt, fprintf(hf, " %-16s %s;\n", ft->type, ft->name)); - fprintf(hf, " %-16s crc;\n", "u_int_32"); - fprintf(hf, " %-16s len;\n", "u_int_32"); + fprintf(hf, " %-16s crc;\n", "u_int32_t"); + fprintf(hf, " %-16s len;\n", "u_int32_t"); fprintf(hf, "};\n"); })); } void generate_log_writer (void) { - FILE *f = fopen("log_write.c", "w"); - assert(f!=0); DO_LOGTYPES(lt, ({ - fprintf2(cf, hf, "int toku_log_%s (TOKULOGGER logger, LSN lsn", lt->name); + fprintf2(cf, hf, "int toku_log_%s (TOKUTXN txn, LSN lsn", lt->name); DO_FIELDS(ft, lt, fprintf2(cf, hf, ", %s %s", ft->type, ft->name)); fprintf(hf, ");\n"); @@ -104,29 +105,27 @@ void generate_log_writer (void) { fprintf(cf, " +8 // crc + len\n"); fprintf(cf, " );\n"); fprintf(cf, " struct wbuf wbuf;\n"); - fprintf(cf, " const char *buf = toku_malloc(buflen);\n"); + fprintf(cf, " char *buf = toku_malloc(buflen);\n"); fprintf(cf, " if (buf==0) return errno;\n"); - fprintf(cf, " wbuf_init(&wbuf, buf, buflen)\n"); + fprintf(cf, " wbuf_init(&wbuf, buf, buflen);\n"); fprintf(cf, " wbuf_char(&wbuf, '%c');\n", lt->command); - fprintf(cf, " wbuf_lsn(&wbuf, lsn);\n"); + fprintf(cf, " wbuf_LSN(&wbuf, lsn);\n"); DO_FIELDS(ft, lt, fprintf(cf, " wbuf_%s(&wbuf, %s);\n", ft->type, ft->name)); - fprintf(cf, " int r= tokulogger_finish(logger, &wbuf);\n"); - fprintf(cf, " assert(buf.ndone==buflen);\n"); + fprintf(cf, " int r= tokulogger_finish(txn->logger, &wbuf);\n"); + fprintf(cf, " assert(wbuf.ndone==buflen);\n"); fprintf(cf, " toku_free(buf);\n"); if (lt->command=='C') { fprintf(cf, " if (r!=0) return r;\n"); fprintf(cf, " // commit has some extra work to do.\n"); fprintf(cf, " if (txn->parent) return 0; // don't fsync if there is a parent.\n"); - fprintf(cf, " else return tokulogger_fsync(logger);\n"); + fprintf(cf, " else return tokulogger_fsync(txn->logger);\n"); } else { fprintf(cf, " return r;\n"); } fprintf(cf, "}\n\n"); })); - int r=fclose(f); - assert(r==0); } void generate_log_reader (void) { @@ -140,8 +139,8 @@ void generate_log_reader (void) { DO_FIELDS(ft, lt, fprintf(cf, " r=toku_fread_%-16s(infile, &data->%-16s, &crc, &actual_len); if (r!=0) return r;\n", ft->type, ft->name)); fprintf(cf, " u_int32_t crc_in_file, len_in_file;\n"); - fprintf(cf, " r=toku_fread_uint32(infile, &crc_in_file); actual_len+=4; if (r!=0) return r;\n"); - fprintf(cf, " r=toku_fread_uint32(infile, &len_in_file); actual_len+=4; if (r!=0) return r;\n"); + fprintf(cf, " r=toku_fread_u_int32_t(infile, &crc_in_file); actual_len+=4; if (r!=0) return r;\n"); + fprintf(cf, " r=toku_fread_u_int32_t(infile, &len_in_file); actual_len+=4; if (r!=0) return r;\n"); fprintf(cf, " if (crc_in_file!=crc || len_in_file!=actual_len) return DB_BADFORMAT;\n"); fprintf(cf, " return 0;\n"); fprintf(cf, "}\n\n"); @@ -155,20 +154,20 @@ void generate_logprint (void) { fprintf(cf, " if (cmd==EOF) return EOF;\n"); fprintf(cf, " u_int32_t len_in_file, len=1;\n"); fprintf(cf, " char charcmd = cmd;\n"); - fprintf(cf, " u_int32_t crc_in_file, crc = toku_crc32(0, &char_cmd, 1);\n"); - fprintf(cf, " switch ((enum lt_command)cmd) {\n"); + fprintf(cf, " u_int32_t crc_in_file, crc = toku_crc32(0, &charcmd, 1);\n"); + fprintf(cf, " switch ((enum lt_cmd)cmd) {\n"); DO_LOGTYPES(lt, ({ fprintf(cf, " case LT_%s: \n", lt->name); // We aren't using the log reader here because we want better diagnostics as soon as things go wrong. - fprintf(cf, " r = toku_logprint_LSN(outf, f, &crc, &len); if (r!=0) return r;\n"); + fprintf(cf, " r = toku_logprint_%-16s(outf, f, &crc, &len); if (r!=0) return r;\n", "LSN"); DO_FIELDS(ft, lt, - fprintf(cf, " r = toku_logprint_%s(outf, f, &crc, &len); if (r!=0) return r;\n", ft->type)); - fprintf(cf, " r = toku_fread_uint32(infile, &crc_in_file); len+=4; if (r!=0) return r;\n"); + fprintf(cf, " r = toku_logprint_%-16s(outf, f, &crc, &len); if (r!=0) return r;\n", ft->type)); + fprintf(cf, " r = toku_fread_u_int32_t (f, &crc_in_file); len+=4; if (r!=0) return r;\n"); fprintf(cf, " fprintf(outf, \" crc=%%d\", crc_in_file);\n"); - fprintf(cf, " if (crc_in_file!=crc) fprintf(\" actual_crc=%%d\", actual_crc);\n"); - fprintf(cf, " r = toku_fread_uint32(infile, &len_in_file); len+=4; if (r!=0) return r;\n"); + fprintf(cf, " if (crc_in_file!=crc) fprintf(outf, \" actual_crc=%%d\", crc);\n"); + fprintf(cf, " r = toku_fread_u_int32_t (f, &len_in_file); len+=4; if (r!=0) return r;\n"); fprintf(cf, " fprintf(outf, \" len=%%d\", len_in_file);\n"); - fprintf(cf, " if (len_in_file!=len) fprintf(\" actual_len=%%d\", actual_len);\n"); + fprintf(cf, " if (len_in_file!=len) fprintf(outf, \" actual_len=%%d\", len);\n"); fprintf(cf, " if (len_in_file!=len || crc_in_file!=crc) return DB_BADFORMAT;\n"); fprintf(cf, " return 0;;\n\n"); })); @@ -178,12 +177,20 @@ void generate_logprint (void) { fprintf(cf, "}\n\n"); } +const char *codepath = "log_code.c"; +const char *headerpath = "log_header.h"; int main (int argc __attribute__((__unused__)), char *argv[] __attribute__((__unused__))) { - cf = fopen("log_code.c", "w"); assert(cf!=0); - hf = fopen("log_header.h", "w"); assert(hf!=0); + unlink(codepath); + unlink(headerpath); + cf = fopen(codepath, "w"); assert(cf!=0); + hf = fopen(headerpath, "w"); assert(hf!=0); + fprintf2(cf, hf, "/* Do not edit this file. This code generated by logformat.c. Copyright 2007 Tokutek. */\n"); fprintf(cf, "#include <stdio.h>\n"); fprintf(hf, "#include \"brt-internal.h\"\n"); fprintf(cf, "#include \"log_header.h\"\n"); + fprintf(cf, "#include \"wbuf.h\"\n"); + fprintf(cf, "#include \"log-internal.h\"\n"); + generate_lt_enum(); generate_log_struct(); generate_log_writer(); generate_log_reader(); @@ -193,6 +200,9 @@ int main (int argc __attribute__((__unused__)), char *argv[] __attribute__((__u assert(r==0); r=fclose(cf); assert(r==0); + // Make it tougher to modify by mistake + chmod(codepath, S_IRUSR|S_IRGRP|S_IROTH); + chmod(headerpath, S_IRUSR|S_IRGRP|S_IROTH); } return 0; }