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