From ee3e24d7084942063168796c2655036d250503fe Mon Sep 17 00:00:00 2001 From: Konstantin Osipov <kostja.osipov@gmail.com> Date: Fri, 24 Jun 2011 19:54:04 +0400 Subject: [PATCH] Cleanup: remove v04 and v04 snapshot/xlog formats. Basic cleanup that removew old/unused code. --- core/log_io.m | 186 +++++++++----------------------------------- include/log_io.h | 7 +- mod/box/box.m | 21 +---- mod/feeder/feeder.m | 2 +- 4 files changed, 43 insertions(+), 173 deletions(-) diff --git a/core/log_io.m b/core/log_io.m index e652f734bb..d0335a8160 100644 --- a/core/log_io.m +++ b/core/log_io.m @@ -49,23 +49,17 @@ const u16 snap_tag = -1; const u16 wal_tag = -2; const u64 default_cookie = 0; const u32 default_version = 11; -const u32 snap_marker_v04 = -1U; -const u64 xlog_marker_v04 = -1ULL; -const u64 xlog_eof_marker_v04 = 0; const u32 marker_v11 = 0xba0babed; const u32 eof_marker_v11 = 0x10adab1e; const char *snap_suffix = ".snap"; const char *xlog_suffix = ".xlog"; const char *inprogress_suffix = ".inprogress"; -const char *v04 = "0.04\n"; -const char *v03 = "0.03\n"; const char *v11 = "0.11\n"; const char *snap_mark = "SNAP\n"; const char *xlog_mark = "XLOG\n"; #define ROW_EOF (void *)1 -static struct tbuf *row_reader_v04(FILE *f, struct palloc_pool *pool); static struct tbuf *row_reader_v11(FILE *f, struct palloc_pool *pool); struct log_io_iter { @@ -78,19 +72,6 @@ struct log_io_iter { int io_rate_limit; }; -struct row_v04 { - i64 lsn; /* this used to be tid */ - u16 type; - u32 len; - u8 data[]; -} __packed__; - -static inline struct row_v04 *row_v04(const struct tbuf *t) -{ - return (struct row_v04 *)t->data; -} - - int confirm_lsn(struct recovery_state *r, i64 lsn) { @@ -122,21 +103,6 @@ next_lsn(struct recovery_state *r, i64 new_lsn) return r->lsn; } -static void -xlog04_class(struct log_io_class *c) -{ - c->suffix = xlog_suffix; - c->filetype = xlog_mark; - c->version = v04; - c->reader = row_reader_v04; - c->marker = xlog_marker_v04; - c->marker_size = sizeof(xlog_marker_v04); - c->eof_marker = xlog_eof_marker_v04; - c->eof_marker_size = sizeof(xlog_eof_marker_v04); - - c->rows_per_file = 50000; /* sane defaults */ - c->fsync_delay = 0; -} static void v11_class(struct log_io_class *c) @@ -153,51 +119,31 @@ v11_class(struct log_io_class *c) c->fsync_delay = 0; } -static struct log_io_class ** -snap_classes(row_reader snap_row_reader, const char *dirname) +static struct log_io_class * +snapshot_class_create(const char *dirname) { - struct log_io_class **c = calloc(3, sizeof(*c)); + struct log_io_class *c = calloc(1, sizeof(*c)); if (c == NULL) panic("calloc"); - c[0] = calloc(1, sizeof(**c)); - c[1] = calloc(1, sizeof(**c)); - if (c[0] == NULL || c[1] == NULL) - panic("calloc"); + v11_class(c); + c->filetype = snap_mark; + c->suffix = snap_suffix; - c[0]->suffix = snap_suffix; - c[0]->filetype = snap_mark; - c[0]->version = v03; - c[0]->eof_marker_size = 0; /* no end marker */ - c[0]->marker = snap_marker_v04; - c[0]->marker_size = sizeof(snap_marker_v04); - c[0]->rows_per_file = 0; - c[0]->reader = snap_row_reader; - - v11_class(c[1]); - c[1]->filetype = c[0]->filetype; - c[1]->suffix = c[0]->suffix; - - c[0]->dirname = c[1]->dirname = dirname ? strdup(dirname) : NULL; + c->dirname = dirname ? strdup(dirname) : NULL; return c; } -static struct log_io_class ** -xlog_classes(const char *dirname) +static struct log_io_class * +xlog_class_create(const char *dirname) { - struct log_io_class **c = calloc(3, sizeof(*c)); + struct log_io_class *c = calloc(1, sizeof(*c)); if (c == NULL) panic("calloc"); - c[0] = calloc(1, sizeof(**c)); - c[1] = calloc(1, sizeof(**c)); - if (c[0] == NULL || c[1] == NULL) - panic("calloc"); - - xlog04_class(c[0]); - v11_class(c[1]); + v11_class(c); - c[0]->dirname = c[1]->dirname = dirname ? strdup(dirname) : NULL; + c->dirname = dirname ? strdup(dirname) : NULL; return c; } @@ -477,53 +423,6 @@ convert_to_v11(struct tbuf *orig, u16 tag, const u64 cookie, i64 lsn) return row; } -static struct tbuf * -row_reader_v04(FILE *f, struct palloc_pool *pool) -{ - const int header_size = offsetof(struct row_v04, data); - struct tbuf *m = tbuf_alloc(pool); - u32 crc, calculated_crc; - - /* - * it's imposible to distinguish between EOF and bad record condition here - * since bad record may have bogus length - * so if record is suspicious simply return NULL to the caller - */ - - if (fread(m->data, header_size, 1, f) != 1) - return ROW_EOF; - m->len = header_size; - - /* filter out rows with definitly wrong length */ - if (row_v04(m)->len > (1 << 20)) { - say_error("record too long(%" PRIi32 "), probably damaged", row_v04(m)->len); - return NULL; - } - - tbuf_ensure(m, header_size + row_v04(m)->len); - if (fread(row_v04(m)->data, row_v04(m)->len, 1, f) != 1) - return ROW_EOF; - - m->len += row_v04(m)->len; - - if (fread(&crc, sizeof(crc), 1, f) != 1) - return ROW_EOF; - - calculated_crc = crc32(m->data, m->len); - if (crc != calculated_crc) { - say_error("crc32 mismatch"); - return NULL; - } - - say_debug("read row v04 success lsn:%" PRIi64, row_v04(m)->lsn); - - /* we're copying row data twice here, it's ok since this is legacy function */ - struct tbuf *data = tbuf_alloc(pool); - tbuf_append(data, &row_v04(m)->type, sizeof(row_v04(m)->type)); - tbuf_append(data, row_v04(m)->data, row_v04(m)->len); - - return convert_to_v11(data, wal_tag, default_cookie, row_v04(m)->lsn); -} static struct tbuf * row_reader_v11(FILE *f, struct palloc_pool *pool) @@ -619,7 +518,7 @@ close_log(struct log_io **lptr) panic("can't rename 'inprogress' WAL"); } - if (l->class->eof_marker_size > 0 && l->mode == LOG_WRITE) { + if (l->mode == LOG_WRITE) { if (fwrite(&l->class->eof_marker, l->class->eof_marker_size, 1, l->f) != 1) say_error("can't write eof_marker"); } @@ -704,7 +603,7 @@ format_filename(char *filename, struct log_io_class *class, i64 lsn, int suffix) } static struct log_io * -open_for_read(struct recovery_state *recover, struct log_io_class **class, i64 lsn, int suffix, +open_for_read(struct recovery_state *recover, struct log_io_class *class, i64 lsn, int suffix, const char *filename) { char filetype[32], version[32], buf[256]; @@ -723,7 +622,7 @@ open_for_read(struct recovery_state *recover, struct log_io_class **class, i64 l /* when filename is not null it is forced open for debug reading */ if (filename == NULL) { assert(lsn != 0); - format_filename(l->filename, *class, lsn, suffix); + format_filename(l->filename, class, lsn, suffix); } else { assert(lsn == 0); strncpy(l->filename, filename, PATH_MAX); @@ -749,22 +648,16 @@ open_for_read(struct recovery_state *recover, struct log_io_class **class, i64 l goto error; } - if (strcmp((*class)->filetype, filetype) != 0) { + if (strcmp(class->filetype, filetype) != 0) { diag_set_error(1, "unknown filetype"); goto error; } - while (*class) { - if (strcmp((*class)->version, version) == 0) - break; - class++; - } - - if (*class == NULL) { + if (strcmp(class->version, version) != 0) { diag_set_error(1, "unknown version"); goto error; } - l->class = *class; + l->class = class; if (strcmp(version, v11) == 0) { for (;;) { @@ -865,20 +758,20 @@ open_for_write(struct recovery_state *recover, struct log_io_class *class, i64 l /* this little hole shouldn't be used too much */ int -read_log(const char *filename, row_reader reader, +read_log(const char *filename, row_handler *xlog_handler, row_handler *snap_handler, void *state) { struct log_io_iter i; struct log_io *l; - struct log_io_class **c; + struct log_io_class *c; struct tbuf *row; row_handler *h; if (strstr(filename, xlog_suffix)) { - c = xlog_classes(NULL); + c = xlog_class_create(NULL); h = xlog_handler; } else if (strstr(filename, snap_suffix)) { - c = snap_classes(reader, NULL); + c = snapshot_class_create(NULL); h = snap_handler; } else { say_error("don't know what how to read `%s'", filename); @@ -908,7 +801,7 @@ recover_snap(struct recovery_state *r) @try { memset(&i, 0, sizeof(i)); - lsn = greatest_lsn(r->snap_prefered_class); + lsn = greatest_lsn(r->snap_class); if (lsn <= 0) { say_error("can't find snapshot"); return -1; @@ -1033,7 +926,7 @@ recover_remaining_wals(struct recovery_state *r) size_t rows_before; current_lsn = r->confirmed_lsn + 1; - wal_greatest_lsn = greatest_lsn(r->wal_prefered_class); + wal_greatest_lsn = greatest_lsn(r->wal_class); /* if the caller already opened WAL for us, recover from it first */ if (r->current_wal != NULL) @@ -1064,7 +957,7 @@ recover_remaining_wals(struct recovery_state *r) next_wal = open_for_read(r, r->wal_class, current_lsn, -1, NULL); if (next_wal == NULL) { char *filename = - format_filename(NULL, *r->wal_class, current_lsn, -1); + format_filename(NULL, r->wal_class, current_lsn, -1); say_warn("unlink broken %s wal", filename); if (inprogress_log_unlink(filename) != 0) @@ -1133,7 +1026,7 @@ recover(struct recovery_state *r, i64 lsn) if (lsn == 0) { result = recover_snap(r); if (result < 0) { - if (greatest_lsn(r->snap_prefered_class) <= 0) { + if (greatest_lsn(r->snap_class) <= 0) { say_crit("didn't you forget to initialize storage with --init-storage switch?"); _exit(1); } @@ -1153,7 +1046,7 @@ recover(struct recovery_state *r, i64 lsn) */ if (r->current_wal == NULL) { i64 next_lsn = r->confirmed_lsn + 1; - i64 lsn = find_including_file(r->wal_prefered_class, next_lsn); + i64 lsn = find_including_file(r->wal_class, next_lsn); if (lsn <= 0) { say_error("can't find wal containing record with lsn:%" PRIi64, next_lsn); result = -1; @@ -1297,7 +1190,7 @@ write_to_disk(void *_state, struct tbuf *t) if (wal == NULL) /* Open WAL with '.inprogress' suffix. */ - wal = open_for_write(r, r->wal_prefered_class, wal_write_request(t)->lsn, -1); + wal = open_for_write(r, r->wal_class, wal_write_request(t)->lsn, -1); else if (wal->rows == 1) { /* rename wal after first successfull write to name without inprogress suffix*/ if (inprogress_log_rename(wal->filename) != 0) { @@ -1402,7 +1295,7 @@ wal_write(struct recovery_state *r, u16 tag, u64 cookie, i64 lsn, struct tbuf *r struct recovery_state * recover_init(const char *snap_dirname, const char *wal_dirname, - row_reader snap_row_reader, row_handler row_handler, + row_handler row_handler, int rows_per_file, double fsync_delay, int inbox_size, int flags, void *data) { @@ -1415,13 +1308,11 @@ recover_init(const char *snap_dirname, const char *wal_dirname, r->row_handler = row_handler; r->data = data; - r->snap_class = snap_classes(snap_row_reader, snap_dirname); - r->snap_prefered_class = r->snap_class[1]; + r->snap_class = snapshot_class_create(snap_dirname); - r->wal_class = xlog_classes(wal_dirname); - r->wal_prefered_class = r->wal_class[1]; - r->wal_prefered_class->rows_per_file = rows_per_file; - r->wal_prefered_class->fsync_delay = fsync_delay; + r->wal_class = xlog_class_create(wal_dirname); + r->wal_class->rows_per_file = rows_per_file; + r->wal_class->fsync_delay = fsync_delay; if ((flags & RECOVER_READONLY) == 0) r->wal_writer = spawn_child("wal_writer", inbox_size, write_to_disk, r); @@ -1432,13 +1323,8 @@ recover_init(const char *snap_dirname, const char *wal_dirname, void recovery_setup_panic(struct recovery_state *r, bool on_snap_error, bool on_wal_error) { - struct log_io_class **class; - - for (class = r->wal_class; *class; class++) - (*class)->panic_if_error = on_wal_error; - - for (class = r->snap_class; *class; class++) - (*class)->panic_if_error = on_snap_error; + r->wal_class->panic_if_error = on_wal_error; + r->snap_class->panic_if_error = on_snap_error; } static void @@ -1529,7 +1415,7 @@ snapshot_save(struct recovery_state *r, void (*f) (struct log_io_iter *)) memset(&i, 0, sizeof(i)); - snap = open_for_write(r, r->snap_prefered_class, r->confirmed_lsn, -1); + snap = open_for_write(r, r->snap_class, r->confirmed_lsn, -1); if (snap == NULL) panic_status(diag_get_last_error()->code, "can't open snap for writing"); diff --git a/include/log_io.h b/include/log_io.h index 34b0b4ce5f..f47601e046 100644 --- a/include/log_io.h +++ b/include/log_io.h @@ -82,7 +82,8 @@ struct recovery_state { i64 lsn, confirmed_lsn; struct log_io *current_wal; /* the WAL we'r currently reading/writing from/to */ - struct log_io_class **snap_class, **wal_class, *snap_prefered_class, *wal_prefered_class; + struct log_io_class *snap_class; + struct log_io_class *wal_class; struct child *wal_writer; /* row_handler will be presented by most recent format of data @@ -129,7 +130,7 @@ static inline struct row_v11 *row_v11(const struct tbuf *t) struct tbuf *convert_to_v11(struct tbuf *orig, u16 tag, u64 cookie, i64 lsn); struct recovery_state *recover_init(const char *snap_dirname, const char *xlog_dirname, - row_reader snap_row_reader, row_handler row_handler, + row_handler row_handler, int rows_per_file, double fsync_delay, int inbox_size, int flags, void *data); int recover(struct recovery_state *, i64 lsn); @@ -142,7 +143,7 @@ void recovery_setup_panic(struct recovery_state *r, bool on_snap_error, bool on_ int confirm_lsn(struct recovery_state *r, i64 lsn); int64_t next_lsn(struct recovery_state *r, i64 new_lsn); -int read_log(const char *filename, row_reader reader, +int read_log(const char *filename, row_handler xlog_handler, row_handler snap_handler, void *state); int default_remote_row_handler(struct recovery_state *r, struct tbuf *row); diff --git a/mod/box/box.m b/mod/box/box.m index 721c9909c8..30af659d5d 100644 --- a/mod/box/box.m +++ b/mod/box/box.m @@ -946,22 +946,6 @@ box_xlog_sprint(struct tbuf *buf, const struct tbuf *t) return 0; } -struct tbuf * -box_snap_reader(FILE *f, struct palloc_pool *pool) -{ - struct tbuf *row = tbuf_alloc(pool); - const int header_size = sizeof(*box_snap_row(row)); - - tbuf_reserve(row, header_size); - if (fread(row->data, header_size, 1, f) != 1) - return NULL; - - tbuf_reserve(row, box_snap_row(row)->data_size); - if (fread(box_snap_row(row)->data, box_snap_row(row)->data_size, 1, f) != 1) - return NULL; - - return convert_to_v11(row, snap_tag, default_cookie, 0); -} static int snap_print(struct recovery_state *r __attribute__((unused)), struct tbuf *t) @@ -1379,8 +1363,7 @@ mod_init(void) } recovery_state = recover_init(cfg.snap_dir, cfg.wal_dir, - box_snap_reader, recover_row, - cfg.rows_per_wal, cfg.wal_fsync_delay, + recover_row, cfg.rows_per_wal, cfg.wal_fsync_delay, cfg.wal_writer_inbox_size, init_storage ? RECOVER_READONLY : 0, NULL); @@ -1459,7 +1442,7 @@ mod_init(void) int mod_cat(const char *filename) { - return read_log(filename, box_snap_reader, xlog_print, snap_print, NULL); + return read_log(filename, xlog_print, snap_print, NULL); } void diff --git a/mod/feeder/feeder.m b/mod/feeder/feeder.m index be2f8b8f1f..0aa184da2e 100644 --- a/mod/feeder/feeder.m +++ b/mod/feeder/feeder.m @@ -87,7 +87,7 @@ recover_feed_slave(int sock) send_row(NULL, ver); log_io = recover_init(NULL, cfg.wal_feeder_dir, - NULL, send_row, INT32_MAX, 0, 64, RECOVER_READONLY, false); + send_row, INT32_MAX, 0, 64, RECOVER_READONLY, false); recover(log_io, lsn); recover_follow(log_io, 0.1); -- GitLab