From a2a58e6ef0bf55088f8b15c25bf9e5210e4ba150 Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Mon, 5 Feb 2024 23:26:26 -0500 Subject: [PATCH 1/7] vere: print epocs in "info" cmd --- pkg/vere/main.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pkg/vere/main.c b/pkg/vere/main.c index c6e72a3cdf..db04d88c48 100644 --- a/pkg/vere/main.c +++ b/pkg/vere/main.c @@ -1586,6 +1586,23 @@ _cw_info(c3_i argc, c3_c* argv[]) u3_disk_slog(log_u); printf("\n"); + + + { + c3_z len_z = u3_disk_epoc_list(log_u, 0); + c3_d* sot_d = c3_malloc(len_z * sizeof(c3_d)); + u3_disk_epoc_list(log_u, sot_d); + + fprintf(stderr, "epocs:\r\n"); + + while ( len_z-- ) { + fprintf(stderr, " 0i%" PRIu64 "\r\n", sot_d[len_z]); + } + + c3_free(sot_d); + fprintf(stderr, "\r\n"); + } + u3_lmdb_stat(log_u->mdb_u, stdout); u3_disk_exit(log_u); From 8b51fecc9a078a514ef5c2642f8cbc8258bc6734 Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Mon, 5 Feb 2024 23:41:36 -0500 Subject: [PATCH 2/7] vere: correct sscanf() parsing, fully consume input --- pkg/vere/disk.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/pkg/vere/disk.c b/pkg/vere/disk.c index 559cc5107f..31da411720 100644 --- a/pkg/vere/disk.c +++ b/pkg/vere/disk.c @@ -1315,20 +1315,26 @@ u3_disk_epoc_last(u3_disk* log_u, c3_d* lat_d) u3_dire* die_u = u3_foil_folder(log_u->com_u->pax_c); u3_dent* den_u = die_u->dil_u; c3_o ret_o = c3n; - - *lat_d = 0; + c3_d epo_d = 0; + c3_d val_d; + c3_i car_i; while ( den_u ) { - c3_d epo_d = 0; - if ( 1 == sscanf(den_u->nam_c, "0i%" PRIc3_d, &epo_d) ) { + if ( (1 == sscanf(den_u->nam_c, "0i%" SCNu64 "%n", &val_d, &car_i)) + && (0 < car_i) + && ('\0' == *(den_u->nam_c + car_i)) ) + { ret_o = c3y; // NB: returns yes if the directory merely exists - *lat_d = c3_max(epo_d, *lat_d); // update the latest epoch number + epo_d = c3_max(epo_d, val_d); } + den_u = den_u->nex_u; } u3_dire_free(die_u); + *lat_d = epo_d; + return ret_o; } @@ -1340,12 +1346,17 @@ u3_disk_epoc_list(u3_disk* log_u, c3_d* sot_d) u3_dire* ned_u = u3_foil_folder(log_u->com_u->pax_c); u3_dent* den_u = ned_u->dil_u; c3_z len_z = 0; + c3_i car_i; + c3_d val_d; while ( den_u ) { // count epochs - c3_d tmp_d; - if ( 1 == sscanf(den_u->nam_c, "0i%" PRIc3_d, &tmp_d) ) { + if ( (1 == sscanf(den_u->nam_c, "0i%" SCNu64 "%n", &val_d, &car_i)) + && (0 < car_i) + && ('\0' == *(den_u->nam_c + car_i)) ) + { len_z++; } + den_u = den_u->nex_u; } @@ -1358,9 +1369,13 @@ u3_disk_epoc_list(u3_disk* log_u, c3_d* sot_d) den_u = ned_u->dil_u; while ( den_u ) { - if ( 1 == sscanf(den_u->nam_c, "0i%" PRIc3_d, (sot_d + len_z)) ) { - len_z++; + if ( (1 == sscanf(den_u->nam_c, "0i%" SCNu64 "%n", &val_d, &car_i)) + && (0 < car_i) + && ('\0' == *(den_u->nam_c + car_i)) ) + { + sot_d[len_z++] = val_d; } + den_u = den_u->nex_u; } @@ -1636,6 +1651,8 @@ _disk_epoc_load(u3_disk* log_u, c3_d lat_d) { c3_c ver_c[8]; c3_w ver_w; + c3_i car_i; + if ( c3n == _disk_epoc_meta(log_u, lat_d, "epoc", sizeof(ver_c) - 1, ver_c) ) { @@ -1645,7 +1662,10 @@ _disk_epoc_load(u3_disk* log_u, c3_d lat_d) return _epoc_gone; } - if ( 1 != sscanf(ver_c, "%d", &ver_w) ) { + if ( (1 != sscanf(ver_c, "%" SCNu32 "%n", &ver_w, &car_i)) + && (0 < car_i) + && ('\0' == *(ver_c + car_i)) ) + { fprintf(stderr, "disk: failed to parse epoch version: '%s'\r\n", ver_c); return _epoc_fail; } From 7db71e7531932856dc47dd101ff92dd0a8c3beb1 Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Tue, 6 Feb 2024 23:08:53 -0500 Subject: [PATCH 3/7] vere: don't rollover in chop --- pkg/vere/main.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/pkg/vere/main.c b/pkg/vere/main.c index db04d88c48..b4c13b10ff 100644 --- a/pkg/vere/main.c +++ b/pkg/vere/main.c @@ -2494,19 +2494,6 @@ _cw_chop(c3_i argc, c3_c* argv[]) u3_disk_kindly(log_u, u3_Host.eve_d); - // create new epoch - c3_d fir_d, las_d; - if ( c3n == u3_lmdb_gulf(log_u->mdb_u, &fir_d, &las_d) ) { - fprintf(stderr, "chop: failed to get first/last events\r\n"); - exit(1); - } - - // create new epoch if latest isn't empty - if ( (fir_d != las_d) && (c3n == u3_disk_epoc_roll(log_u, las_d)) ) { - fprintf(stderr, "chop: failed to create new epoch\r\n"); - exit(1); - } - c3_z len_z = u3_disk_epoc_list(log_u, 0); if ( len_z <= 2 ) { From 5b1a5fec59e9db0dd53a35b0146e16d7c5145090 Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Tue, 6 Feb 2024 23:40:28 -0500 Subject: [PATCH 4/7] vere: refactors epoc lifecyle, centralizes invariants --- pkg/vere/disk.c | 148 ++++++++++++++++++++++++++++++++++-------------- pkg/vere/main.c | 60 ++------------------ pkg/vere/vere.h | 20 +++---- 3 files changed, 119 insertions(+), 109 deletions(-) diff --git a/pkg/vere/disk.c b/pkg/vere/disk.c index 31da411720..bd37f4c2ff 100644 --- a/pkg/vere/disk.c +++ b/pkg/vere/disk.c @@ -1163,10 +1163,10 @@ u3_disk_epoc_zero(u3_disk* log_u) return c3n; } -/* u3_disk_epoc_roll: epoch rollover. +/* _disk_epoc_roll: epoch rollover. */ -c3_o -u3_disk_epoc_roll(u3_disk* log_u, c3_d epo_d) +static c3_o +_disk_epoc_roll(u3_disk* log_u, c3_d epo_d) { u3_assert(epo_d); @@ -1255,6 +1255,8 @@ u3_disk_epoc_roll(u3_disk* log_u, c3_d epo_d) close(epo_i); + fprintf(stderr, "disk: created epoch %" PRIc3_d "\r\n", epo_d); + // load new epoch directory and set it in log_u log_u->epo_d = epo_d; log_u->ver_w = U3D_VERLAT; @@ -1272,10 +1274,10 @@ u3_disk_epoc_roll(u3_disk* log_u, c3_d epo_d) return c3n; } -/* u3_disk_epoc_kill: delete an epoch. +/* _disk_epoc_kill: delete an epoch. */ -c3_o -u3_disk_epoc_kill(u3_disk* log_u, c3_d epo_d) +static c3_o +_disk_epoc_kill(u3_disk* log_u, c3_d epo_d) { // get epoch directory c3_c epo_c[8193]; @@ -1424,30 +1426,15 @@ _disk_migrate(u3_disk* log_u, c3_d eve_d) // XX: put old log in separate pointer (old_u?)? // get metadata from old log - c3_d who_d[2]; - c3_o fak_o; - c3_w lif_w; + c3_d who_d[2]; + c3_o fak_o; + c3_w lif_w; + if ( c3y != u3_disk_read_meta(log_u->mdb_u, 0, who_d, &fak_o, &lif_w) ) { fprintf(stderr, "disk: failed to read metadata\r\n"); return c3n; } - // get first/last event numbers from old log - c3_d fir_d, las_d; - if ( c3n == u3_lmdb_gulf(log_u->mdb_u, &fir_d, &las_d) ) { - fprintf(stderr, "disk: failed to get first/last event numbers\r\n"); - return c3n; - } - - // set version to 2 (migration in progress) - { - c3_w ver_w = U3D_VER2; - if ( c3n == _disk_save_meta(log_u->mdb_u, "version", 4, (c3_y*)&ver_w) ) { - fprintf(stderr, "disk: failed to set version to 2\r\n"); - return c3n; - } - } - // finish with old log u3_lmdb_exit(log_u->mdb_u); log_u->mdb_u = 0; @@ -1462,15 +1449,6 @@ _disk_migrate(u3_disk* log_u, c3_d eve_d) fprintf(stderr, "disk: migrating disk to v%d format\r\n", U3D_VERLAT); - // ensure there's a current snapshot - if ( eve_d != las_d ) { - fprintf(stderr, "disk: snapshot is out of date, please " - "start/shutdown your pier gracefully first\r\n"); - fprintf(stderr, "disk: eve_d (%" PRIc3_d ") != las_d (%" PRIc3_d ")\r\n", - eve_d, las_d); - return c3n; - } - // initialize first epoch "0i0" if ( c3n == u3_disk_epoc_zero(log_u) ) { fprintf(stderr, "disk: failed to initialize first epoch\r\n"); @@ -1566,8 +1544,6 @@ _disk_migrate(u3_disk* log_u, c3_d eve_d) return c3n; } - // XX: maybe rollover - // success fprintf(stderr, "disk: migrated disk to v%d format\r\n", U3D_VERLAT); @@ -1599,32 +1575,50 @@ _disk_vere_diff(u3_disk* log_u) void u3_disk_kindly(u3_disk* log_u, c3_d eve_d) { + // ensure there's a current snapshot + // + if ( eve_d != log_u->dun_d ) { + fprintf(stderr, "disk: snapshot (event %" PRIc3_d ") is out of date\r\n" + " (latest event is %" PRIc3_d "\r\n", + eve_d, log_u->dun_d); + // XX need better instructions + // + fprintf(stderr, "start/shutdown your pier gracefully first\r\n"); + exit(1); + } + switch ( log_u->ver_w ) { - case U3D_VER1: + case U3D_VER1: { + // set version to 2 (migration in progress) + c3_w ver_w = U3D_VER2; + if ( c3n == _disk_save_meta(log_u->mdb_u, "version", 4, (c3_y*)&ver_w) ) { + fprintf(stderr, "disk: failed to set version to 2\r\n"); + exit(1); + } + } // fallthru + case U3D_VER2: { if ( c3n == _disk_migrate(log_u, eve_d) ) { fprintf(stderr, "disk: failed to migrate event log\r\n"); exit(1); } - if ( c3n == u3_disk_epoc_roll(log_u, log_u->dun_d) ) { + if ( c3n == _disk_epoc_roll(log_u, eve_d) ) { fprintf(stderr, "disk: failed to initialize epoch\r\n"); exit(1); } - break; - } + } break; case U3D_VER3: { if ( (0 == log_u->epo_d) || (c3y == _disk_vere_diff(log_u)) ) { - if ( c3n == u3_disk_epoc_roll(log_u, log_u->dun_d) ) { + if ( c3n == _disk_epoc_roll(log_u, eve_d) ) { fprintf(stderr, "disk: failed to initialize epoch\r\n"); exit(1); } } - break; - } + } break; default: { fprintf(stderr, "disk: unknown disk version: %d\r\n", log_u->ver_w); @@ -1633,6 +1627,69 @@ u3_disk_kindly(u3_disk* log_u, c3_d eve_d) } } +/* u3_disk_chop(): delete all but the latest 2 epocs. +*/ +void +u3_disk_chop(u3_disk* log_u, c3_d eve_d) +{ + c3_z len_z = u3_disk_epoc_list(log_u, 0); + c3_d* sot_d = c3_malloc(len_z * sizeof(c3_d)); + u3_disk_epoc_list(log_u, sot_d); + + if ( len_z <= 2 ) { + fprintf(stderr, "chop: nothing to do, have a great day\r\n"); + exit(0); // enjoy + } + + // delete all but the last two epochs + // + // XX parameterize the number of epochs to chop + // + for ( c3_z i_z = 2; i_z < len_z; i_z++ ) { + fprintf(stderr, "chop: deleting epoch 0i%" PRIu64 "\r\n", + sot_d[i_z]); + if ( c3y != _disk_epoc_kill(log_u, sot_d[i_z]) ) { + fprintf(stderr, "chop: failed to delete epoch 0i%" PRIu64 "\r\n", sot_d[i_z]); + exit(1); + } + } + + // cleanup + c3_free(sot_d); + + // success + fprintf(stderr, "chop: event log truncation complete\r\n"); +} + +/* u3_disk_roll(): rollover to a new epoc. +*/ +void +u3_disk_roll(u3_disk* log_u, c3_d eve_d) +{ + // XX get fir_d from log_u + c3_d fir_d, las_d; + + if ( c3n == u3_lmdb_gulf(log_u->mdb_u, &fir_d, &las_d) ) { + fprintf(stderr, "roll: failed to read first/last event numbers\r\n"); + exit(1); + } + + if ( fir_d == las_d ) { + fprintf(stderr, "roll: latest epoch is empty\r\n"); + exit(0); + } + + if ( (eve_d != las_d) || (eve_d != log_u->dun_d) ) { + fprintf(stderr, "roll: shenanigans!\r\n"); + exit(1); + } + + else if ( c3n == _disk_epoc_roll(log_u, eve_d) ) { + fprintf(stderr, "roll: failed to create new epoch\r\n"); + exit(1); + } +} + typedef enum { _epoc_good = 0, // load successfully _epoc_gone = 1, // version missing, total failure @@ -1710,6 +1767,9 @@ _disk_epoc_load(u3_disk* log_u, c3_d lat_d) } // initialize dun_d/sen_d values + // + // XX save [fir_d] in struct, check on play + // log_u->dun_d = ( 0 != las_d ) ? las_d : lat_d; log_u->sen_d = log_u->dun_d; @@ -1957,7 +2017,7 @@ u3_disk_init(c3_c* pax_c, u3_disk_cb cb_u) "falling back to previous at 0i%" PRIc3_d "\r\n", lat_d, sot_d[1]); - u3_disk_epoc_kill(log_u, lat_d); + _disk_epoc_kill(log_u, lat_d); lat_d = sot_d[1]; try_o = c3y; diff --git a/pkg/vere/main.c b/pkg/vere/main.c index b4c13b10ff..fceee09acb 100644 --- a/pkg/vere/main.c +++ b/pkg/vere/main.c @@ -2493,35 +2493,10 @@ _cw_chop(c3_i argc, c3_c* argv[]) u3_disk* log_u = _cw_disk_init(u3_Host.dir_c); u3_disk_kindly(log_u, u3_Host.eve_d); + u3_disk_chop(log_u, u3_Host.eve_d); - c3_z len_z = u3_disk_epoc_list(log_u, 0); - - if ( len_z <= 2 ) { - fprintf(stderr, "chop: nothing to do, have a great day\r\n"); - exit(0); // enjoy - } - - c3_d* sot_d = c3_malloc(len_z * sizeof(c3_d)); - u3_disk_epoc_list(log_u, sot_d); - - // delete all but the last two epochs - // - // XX parameterize the number of epochs to chop - // - for ( c3_z i_z = 2; i_z < len_z; i_z++ ) { - fprintf(stderr, "chop: deleting epoch 0i%" PRIc3_d "\r\n", sot_d[i_z]); - if ( c3y != u3_disk_epoc_kill(log_u, sot_d[i_z]) ) { - fprintf(stderr, "chop: failed to delete epoch 0i%" PRIu64 "\r\n", sot_d[i_z]); - exit(1); - } - } - - // cleanup - c3_free(sot_d); u3_disk_exit(log_u); - - // success - fprintf(stderr, "chop: event log truncation complete\r\n"); + u3m_stop(); } /* _cw_roll(): rollover to new epoch @@ -2579,35 +2554,10 @@ _cw_roll(c3_i argc, c3_c* argv[]) u3_disk* log_u = _cw_disk_init(u3_Host.dir_c); u3_disk_kindly(log_u, u3_Host.eve_d); + u3_disk_roll(log_u, u3_Host.eve_d); - // check if there's a *current* snapshot - if ( log_u->dun_d != u3_Host.eve_d ) { - fprintf(stderr, "roll: error: snapshot is out of date, please " - "start/shutdown your pier gracefully first\r\n"); - fprintf(stderr, "roll: eve_d: %" PRIc3_d ", dun_d: %" PRIc3_d "\r\n", \ - u3A->eve_d, log_u->dun_d); - exit(1); - } - - // create new epoch - c3_d fir_d, las_d; - if ( c3n == u3_lmdb_gulf(log_u->mdb_u, &fir_d, &las_d) ) { - fprintf(stderr, "roll: failed to get first/last events\r\n"); - exit(1); - } - - if ( fir_d == las_d ) { - fprintf(stderr, "roll: latest epoch already empty\r\n"); - exit(0); - } - else if ( c3n == u3_disk_epoc_roll(log_u, las_d) ) { - fprintf(stderr, "roll: failed to create new epoch\r\n"); - exit(1); - } - - // success - c3_d epo_d = log_u->dun_d + 1; - fprintf(stderr, "roll: epoch rollover complete\r\n"); + u3_disk_exit(log_u); + u3m_stop(); } /* _cw_vere(): download vere diff --git a/pkg/vere/vere.h b/pkg/vere/vere.h index d7a1439fc8..bb3ac9df80 100644 --- a/pkg/vere/vere.h +++ b/pkg/vere/vere.h @@ -1018,16 +1018,6 @@ void u3_disk_plan(u3_disk* log_u, u3_fact* tac_u); - /* u3_disk_epoc_init(): create new epoch. - */ - c3_o - u3_disk_epoc_roll(u3_disk* log_u, c3_d epo_d); - - /* u3_disk_epoc_kill(): delete an epoch. - */ - c3_o - u3_disk_epoc_kill(u3_disk* log_u, c3_d epo_d); - /* u3_disk_epoc_last(): get latest epoch number. */ c3_o @@ -1043,6 +1033,16 @@ void u3_disk_kindly(u3_disk* log_u, c3_d eve_d); + /* u3_disk_chop(): delete all but the latest 2 epocs. + */ + void + u3_disk_chop(u3_disk* log_u, c3_d epo_d); + + /* u3_disk_roll(): rollover to a new epoc. + */ + void + u3_disk_roll(u3_disk* log_u, c3_d epo_d); + /* u3_disk_read_list(): synchronously read a cons list of events. */ u3_weak From 7265051eb8226aabffce9561fefd772eeef040e2 Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Tue, 6 Feb 2024 23:44:55 -0500 Subject: [PATCH 5/7] vere: check that the current snapshot is within the epoc on replay --- pkg/vere/main.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pkg/vere/main.c b/pkg/vere/main.c index fceee09acb..3a5c693c59 100644 --- a/pkg/vere/main.c +++ b/pkg/vere/main.c @@ -2215,10 +2215,17 @@ _cw_play_impl(c3_d eve_d, c3_d sap_d, c3_o mel_o, c3_o sof_o, c3_o ful_o) _cw_play_snap(log_u); } - // XX this should check that snapshot is within epoc, - // and load from the epoc / reboot if it is not + u3_Host.eve_d = u3m_boot(u3_Host.dir_c, (size_t)1 << u3_Host.ops_u.lom_y); + + // XX this should load from the epoc snapshot + // but that clobbers chk/ which is risky // - u3m_boot(u3_Host.dir_c, (size_t)1 << u3_Host.ops_u.lom_y); + if ( u3_Host.eve_d < log_u->epo_d ) { + fprintf(stderr, "mars: pier corrupt: " + "snapshot (%" PRIu64 ") out of epoc (%" PRIu64 "\r\n", + u3_Host.eve_d, log_u->epo_d); + exit(1); + } u3C.slog_f = _cw_play_slog; @@ -2338,7 +2345,7 @@ _cw_play(c3_i argc, c3_c* argv[]) } if ( !_cw_play_impl(eve_d, sap_d, mel_o, sof_o, ful_o) ) { - fprintf(stderr, "mars: nothing to do!"); + fprintf(stderr, "mars: nothing to do!\r\n"); } } From 6f5b5f369fe5deeeaf2b7b073572ecbd1bfa0320 Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Tue, 6 Feb 2024 23:52:22 -0500 Subject: [PATCH 6/7] vere: check for erors opening lmdb iterator --- pkg/vere/disk.c | 5 +++++ pkg/vere/mars.c | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/pkg/vere/disk.c b/pkg/vere/disk.c index bd37f4c2ff..21b0f1c61f 100644 --- a/pkg/vere/disk.c +++ b/pkg/vere/disk.c @@ -573,6 +573,11 @@ u3_disk_walk_init(u3_disk* log_u, eve_d, c3_min(max_d, log_u->dun_d)); + if ( c3n == wok_u->liv_o ) { + c3_free(wok_u); + return 0; + } + return wok_u; } diff --git a/pkg/vere/mars.c b/pkg/vere/mars.c index 020f885d6c..db9056a0ab 100644 --- a/pkg/vere/mars.c +++ b/pkg/vere/mars.c @@ -101,6 +101,11 @@ _mars_play_batch(u3_mars* mar_u, u3_noun dud; u3_weak wen = u3_none; + if ( !wok_u ) { + fprintf(stderr, "play: failed to open event log iterator\r\n"); + return _play_log_e; + } + while ( c3y == u3_disk_walk_live(wok_u) ) { if ( c3n == u3_disk_walk_step(wok_u, &tac_u) ) { u3_disk_walk_done(wok_u); From 1294a60444848f94c9889c8e015655eda30e3c1a Mon Sep 17 00:00:00 2001 From: Matthew LeVan Date: Wed, 7 Feb 2024 11:45:32 -0500 Subject: [PATCH 7/7] disk: migration comment update --- pkg/vere/disk.c | 22 ++++++---------------- pkg/vere/main.c | 2 +- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/pkg/vere/disk.c b/pkg/vere/disk.c index 21b0f1c61f..18fdf31fec 100644 --- a/pkg/vere/disk.c +++ b/pkg/vere/disk.c @@ -1409,22 +1409,12 @@ static c3_o _disk_migrate(u3_disk* log_u, c3_d eve_d) { /* migration steps: - * 0. detect whether we need to migrate or not - * a. if it's a fresh boot via u3_Host.ops_u.nuu -> skip migration - * b. if log/data.mdb is readable and is not v3 -> execute migration - * if not -> skip migration (returns yes) - * 1. set log/data.mdb to version 2 (migration in progress) - * 2. initialize epoch 0i0 - * a. creates epoch directory - * b. creates epoch version file - * c. creates binary version file - * d. creates hard links to data.mdb and lock.mdb in 0i0/ - * e. deletes backup snapshot - * 3. create hard links to data.mdb and lock.mdb in 0i0/ - * 4. use scratch space to initialize new log/data.db in log/tmp - * 5. save old metadata to new db in scratch space - * 6. clobber old log/data.mdb with new log/tmp/data.mdb - * 7. open epoch lmdb and set it in log_u + * 1. initialize epoch 0i0 (see u3_disk_epoc_zero) + * 2. create hard links to data.mdb and lock.mdb in 0i0/ + * 3. use scratch space to initialize new log/data.db in log/tmp + * 4. save old metadata to new db in scratch space + * 5. clobber old log/data.mdb with new log/tmp/data.mdb + * 6. open epoch lmdb and set it in log_u */ // NB: requires that log_u->mdb_u is initialized to log/data.mdb diff --git a/pkg/vere/main.c b/pkg/vere/main.c index 3a5c693c59..599c8fc246 100644 --- a/pkg/vere/main.c +++ b/pkg/vere/main.c @@ -2222,7 +2222,7 @@ _cw_play_impl(c3_d eve_d, c3_d sap_d, c3_o mel_o, c3_o sof_o, c3_o ful_o) // if ( u3_Host.eve_d < log_u->epo_d ) { fprintf(stderr, "mars: pier corrupt: " - "snapshot (%" PRIu64 ") out of epoc (%" PRIu64 "\r\n", + "snapshot (%" PRIu64 ") out of epoc (%" PRIu64 ")\r\n", u3_Host.eve_d, log_u->epo_d); exit(1); }