From ac2587017e1d5cf939a1589395007a9e37496cc8 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Tue, 28 Sep 2021 13:59:55 -0700 Subject: [PATCH] Add write_nr to quorum blocks Add a write_nr field to the quorum block header which is incremented with every write. Each event also gets a write_nr field that is set to the incremented value from the header. This gives us a history of the order of event updates that isn't sensitive to misconfigured time. Signed-off-by: Zach Brown --- kmod/src/format.h | 2 ++ kmod/src/quorum.c | 2 ++ utils/src/print.c | 6 ++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/kmod/src/format.h b/kmod/src/format.h index cb26ed15..b9275eda 100644 --- a/kmod/src/format.h +++ b/kmod/src/format.h @@ -733,7 +733,9 @@ enum { struct scoutfs_quorum_block { struct scoutfs_block_header hdr; + __le64 write_nr; struct scoutfs_quorum_block_event { + __le64 write_nr; __le64 rid; __le64 term; struct scoutfs_timespec ts; diff --git a/kmod/src/quorum.c b/kmod/src/quorum.c index fbaa31e4..34922d78 100644 --- a/kmod/src/quorum.c +++ b/kmod/src/quorum.c @@ -448,8 +448,10 @@ static void set_quorum_block_event(struct super_block *sb, struct scoutfs_quorum return; getnstimeofday64(&ts); + le64_add_cpu(&blk->write_nr, 1); ev = &blk->events[event]; + ev->write_nr = blk->write_nr; ev->rid = cpu_to_le64(sbi->rid); ev->term = cpu_to_le64(term); ev->ts.sec = cpu_to_le64(ts.tv_sec); diff --git a/utils/src/print.c b/utils/src/print.c index b8717048..bb566730 100644 --- a/utils/src/print.c +++ b/utils/src/print.c @@ -898,13 +898,15 @@ static int print_quorum_blocks(int fd, struct scoutfs_super_block *super) printf("quorum blkno %llu (slot %llu)\n", blkno, blkno - SCOUTFS_QUORUM_BLKNO); print_block_header(&blk->hdr, SCOUTFS_BLOCK_SM_SIZE); + printf(" write_nr %llu\n", le64_to_cpu(blk->write_nr)); for (e = 0; e < array_size(event_names); e++) { ev = &blk->events[e]; - printf(" %12s: rid %016llx term %llu ts %llu.%08u\n", + printf(" %12s: rid %016llx term %llu write_nr %llu ts %llu.%08u\n", event_names[e], le64_to_cpu(ev->rid), le64_to_cpu(ev->term), - le64_to_cpu(ev->ts.sec), le32_to_cpu(ev->ts.nsec)); + le64_to_cpu(ev->write_nr), le64_to_cpu(ev->ts.sec), + le32_to_cpu(ev->ts.nsec)); } }