scoutfs-utils: update compaction item printing

We now only use one srch file compaction struct and we store it in
PENDING and BUSY key types.

Signed-off-by: Zach Brown <zab@versity.com>
This commit is contained in:
Zach Brown
2020-10-26 15:19:41 -07:00
committed by Zach Brown
parent a19e151277
commit 838e293413
2 changed files with 48 additions and 30 deletions
+28 -15
View File
@@ -374,27 +374,39 @@ struct scoutfs_srch_block {
#define SCOUTFS_SRCH_COMPACT_ORDER 3
#define SCOUTFS_SRCH_COMPACT_NR (1 << SCOUTFS_SRCH_COMPACT_ORDER)
struct scoutfs_srch_compact_input {
/*
* A persistent record of a srch file compaction operation in progress.
*
* When compacting log files blk and pos aren't used. When compacting
* sorted files blk is the logical block number and pos is the byte
* offset of the next entry. When deleting files pos is the height of
* the level that we're deleting, and blk is the logical block offset of
* the next parent ref array index to descend through.
*/
struct scoutfs_srch_compact {
struct scoutfs_alloc_list_head meta_avail;
struct scoutfs_alloc_list_head meta_freed;
__le64 id;
__u8 nr;
__u8 flags;
struct scoutfs_srch_file sfl[SCOUTFS_SRCH_COMPACT_NR];
struct scoutfs_srch_file out;
struct scoutfs_srch_compact_input {
struct scoutfs_srch_file sfl;
__le64 blk;
__le64 pos;
} in[SCOUTFS_SRCH_COMPACT_NR] __packed;
} __packed;
struct scoutfs_srch_compact_result {
struct scoutfs_alloc_list_head meta_avail;
struct scoutfs_alloc_list_head meta_freed;
__le64 id;
__u8 flags;
struct scoutfs_srch_file sfl;
} __packed;
/* files are insorted logs */
#define SCOUTFS_SRCH_COMPACT_FLAG_LOG (1 << 0)
/* compaction failed, release inputs */
#define SCOUTFS_SRCH_COMPACT_FLAG_ERROR (1 << 1)
/* server -> client: combine input log file entries into output file */
#define SCOUTFS_SRCH_COMPACT_FLAG_LOG (1 << 0)
/* server -> client: combine input sorted file entries into output file */
#define SCOUTFS_SRCH_COMPACT_FLAG_SORTED (1 << 1)
/* server -> client: delete input files */
#define SCOUTFS_SRCH_COMPACT_FLAG_DELETE (1 << 2)
/* client -> server: compaction phase (LOG,SORTED,DELETE) done */
#define SCOUTFS_SRCH_COMPACT_FLAG_DONE (1 << 4)
/* client -> server: compaction failed */
#define SCOUTFS_SRCH_COMPACT_FLAG_ERROR (1 << 5)
/*
* XXX I imagine we should rename these now that they've evolved to track
@@ -496,7 +508,8 @@ struct scoutfs_bloom_block {
/* srch zone, only in server btrees */
#define SCOUTFS_SRCH_LOG_TYPE 1
#define SCOUTFS_SRCH_BLOCKS_TYPE 2
#define SCOUTFS_SRCH_BUSY_TYPE 3
#define SCOUTFS_SRCH_PENDING_TYPE 3
#define SCOUTFS_SRCH_BUSY_TYPE 4
/* free extents in allocator btrees in client and server, by blkno or len */
#define SCOUTFS_FREE_EXTENT_BLKNO_TYPE 1
+20 -15
View File
@@ -322,22 +322,26 @@ static int print_log_trees_item(struct scoutfs_key *key, void *val,
static int print_srch_root_item(struct scoutfs_key *key, void *val,
unsigned val_len, void *arg)
{
struct scoutfs_srch_file *sfl = val;
struct scoutfs_srch_compact_input *scin = val;
struct scoutfs_srch_compact *sc;
struct scoutfs_srch_file *sfl;
int i;
printf(" "SK_FMT"\n", SK_ARG(key));
/* only items in leaf blocks have values */
if (val) {
if (key->sk_type == SCOUTFS_SRCH_BUSY_TYPE) {
scin = val;
printf(" compact: nr_in %u in_flags 0x%x\n",
scin->nr, scin->flags);
for (i = 0; i < scin->nr; i++) {
sfl = &scin->sfl[i];
printf(" [%u] "SRF_FMT"\n",
i, SRF_A(sfl));
if (key->sk_type == SCOUTFS_SRCH_PENDING_TYPE ||
key->sk_type == SCOUTFS_SRCH_BUSY_TYPE) {
sc = val;
printf(" compact %s: nr %u flags 0x%x\n",
key->sk_type == SCOUTFS_SRCH_PENDING_TYPE ?
"pending" : "busy",
sc->nr, sc->flags);
for (i = 0; i < sc->nr; i++) {
printf(" [%u] blk %llu pos %llu sfl "SRF_FMT"\n",
i, le64_to_cpu(sc->in[i].blk),
le64_to_cpu(sc->in[i].pos),
SRF_A(&sc->in[i].sfl));
}
} else {
sfl = val;
@@ -716,15 +720,16 @@ static int print_srch_root_files(struct scoutfs_key *key, void *val,
unsigned val_len, void *arg)
{
struct print_recursion_args *pa = arg;
struct scoutfs_srch_compact_input *scin;
struct scoutfs_srch_compact *sc;
struct scoutfs_srch_file *sfl;
int ret = 0;
int i;
if (key->sk_type == SCOUTFS_SRCH_BUSY_TYPE) {
scin = val;
for (i = 0; i < scin->nr; i++) {
sfl = &scin->sfl[i];
if (key->sk_type == SCOUTFS_SRCH_PENDING_TYPE ||
key->sk_type == SCOUTFS_SRCH_BUSY_TYPE) {
sc = val;
for (i = 0; i < sc->nr; i++) {
sfl = &sc->in[i].sfl;
ret = print_srch_block(pa->fd, &sfl->ref,
sfl->height - 1);
if (ret < 0)