From b9e39ba81161dc0d843ddcac10e2652c9b471d60 Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Fri, 6 Oct 2023 16:07:40 -0400 Subject: [PATCH] vere: factors sorted epoc list out of chop subcommand --- pkg/vere/disk.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ pkg/vere/main.c | 51 +++++++------------------------------------------ pkg/vere/vere.h | 17 +++++++++++------ 3 files changed, 64 insertions(+), 50 deletions(-) diff --git a/pkg/vere/disk.c b/pkg/vere/disk.c index 51ddbd3606..7f3d0efadd 100644 --- a/pkg/vere/disk.c +++ b/pkg/vere/disk.c @@ -1199,6 +1199,52 @@ u3_disk_epoc_last(u3_disk* log_u, c3_d* lat_d) return ret_o; } +/* u3_disk_epoc_list: get descending epoch numbers, "mcut" pattern. +*/ +c3_z +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; + + while ( den_u ) { // count epochs + len_z++; + den_u = den_u->nex_u; + } + + if ( !sot_d ) { + u3_dire_free(ned_u); + return len_z; + } + + len_z = 0; + 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++; + } + den_u = den_u->nex_u; + } + + // sort sot_d naively in descending order + // + c3_d tmp_d; + for ( c3_z i_z = 0; i_z < len_z; i_z++ ) { + for ( c3_z j_z = i_z + 1; j_z < len_z; j_z++ ) { + if ( sot_d[i_z] < sot_d[j_z] ) { + tmp_d = sot_d[i_z]; + sot_d[i_z] = sot_d[j_z]; + sot_d[j_z] = tmp_d; + } + } + } + + u3_dire_free(ned_u); + return len_z; +} + /* _disk_need_migrate: does the disk need to be migrated? */ static c3_o diff --git a/pkg/vere/main.c b/pkg/vere/main.c index 0013ca3af7..9a1680347c 100644 --- a/pkg/vere/main.c +++ b/pkg/vere/main.c @@ -2459,13 +2459,6 @@ _cw_chop(c3_i argc, c3_c* argv[]) u3_disk_kindly(log_u, u3_Host.eve_d); - // get latest epoch number prior to creating a new one - c3_d pre_d; - if ( c3n == u3_disk_epoc_last(log_u, &pre_d) ) { - fprintf(stderr, "chop: failed to find last epoch\r\n"); - exit(1); - } - // create new epoch c3_d fir_d, las_d; if ( c3n == u3_lmdb_gulf(log_u->mdb_u, &fir_d, &las_d) ) { @@ -2479,50 +2472,20 @@ _cw_chop(c3_i argc, c3_c* argv[]) exit(1); } - // sort epoch directories in descending order - 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; - while ( den_u ) { // count epochs - len_z++; - den_u = den_u->nex_u; - } - c3_d* sot_d = c3_malloc(len_z * sizeof(c3_d)); - len_z = 0; - 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++; - } - den_u = den_u->nex_u; - } + 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 } - // sort sot_d naively in descending order - c3_d tmp_d; - for ( c3_z i_z = 0; i_z < len_z; i_z++ ) { - for ( c3_z j_z = i_z + 1; j_z < len_z; j_z++ ) { - if ( sot_d[i_z] < sot_d[j_z] ) { - tmp_d = sot_d[i_z]; - sot_d[i_z] = sot_d[j_z]; - sot_d[j_z] = tmp_d; - } - } - } - - // get latest epoch number prior to creating a new one - c3_d pos_d; - if ( c3n == u3_disk_epoc_last(log_u, &pos_d) ) { - fprintf(stderr, "chop: failed to find last epoch\r\n"); - exit(1); - } + 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 + // + // 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]) ) { @@ -2532,7 +2495,7 @@ _cw_chop(c3_i argc, c3_c* argv[]) } // cleanup - u3_dire_free(ned_u); + c3_free(sot_d); u3_disk_exit(log_u); // success diff --git a/pkg/vere/vere.h b/pkg/vere/vere.h index bff229e2f3..b2b78b5e81 100644 --- a/pkg/vere/vere.h +++ b/pkg/vere/vere.h @@ -1009,18 +1009,23 @@ /* u3_disk_epoc_init(): create new epoch. */ - c3_o - u3_disk_epoc_init(u3_disk* log_u, c3_d epo_d); + c3_o + u3_disk_epoc_init(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); + c3_o + u3_disk_epoc_kill(u3_disk* log_u, c3_d epo_d); /* u3_disk_epoc_last(): get latest epoch number. */ - c3_o - u3_disk_epoc_last(u3_disk* log_u, c3_d* lat_d); + c3_o + u3_disk_epoc_last(u3_disk* log_u, c3_d* lat_d); + + /* u3_disk_epoc_list: get descending epoch numbers, "mcut" pattern. + */ + c3_z + u3_disk_epoc_list(u3_disk* log_u, c3_d* sot_d); /* u3_disk_kindly(): do the needful. */