Skip to content

Commit

Permalink
vere: factors sorted epoc list out of chop subcommand
Browse files Browse the repository at this point in the history
  • Loading branch information
joemfb committed Oct 6, 2023
1 parent fc7efea commit b9e39ba
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 50 deletions.
46 changes: 46 additions & 0 deletions pkg/vere/disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
51 changes: 7 additions & 44 deletions pkg/vere/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) ) {
Expand All @@ -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]) ) {
Expand All @@ -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
Expand Down
17 changes: 11 additions & 6 deletions pkg/vere/vere.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down

0 comments on commit b9e39ba

Please sign in to comment.