From: Dan Sheppard Date: Mon, 28 Apr 2025 12:46:22 +0000 (+0100) Subject: Allow superblock to be written without fsync. X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~dans/git?a=commitdiff_plain;h=ab0d45e13e053e7659d5fd96a51e0948e83cbdc7;p=coquet.git Allow superblock to be written without fsync. If we're going to store book fsync watermarks there, we need to be able not to fsync here, to avoid the cost of an unnecessary double fsync. --- diff --git a/src/main.c b/src/main.c index 48acc2d..7f90a4f 100644 --- a/src/main.c +++ b/src/main.c @@ -32,7 +32,7 @@ int main() { bail(&cq,r); r = cq_super_load(&cq,COQUET_FILE_MAIN,&super,1); bail(&cq,r); - cq_super_save(&cq,COQUET_FILE_MAIN,&super,1); + cq_super_save(&cq,COQUET_FILE_MAIN,&super,1,1); r = (cq.vfs_funcs.close)(cq.vfs_data,COQUET_FILE_MAIN); bail(&cq,r); r = coquet_finish(&cq); diff --git a/src/page.c b/src/page.c index 33f4fde..f20d9e9 100644 --- a/src/page.c +++ b/src/page.c @@ -110,7 +110,7 @@ void test_page() { test_bail(&cq,r); cq_super_load(&cq,COQUET_FILE_MAIN,&super,1); - cq_super_save(&cq,COQUET_FILE_MAIN,&super,1); + cq_super_save(&cq,COQUET_FILE_MAIN,&super,1,1); r = coquet_write_start(&cq,COQUET_FILE_MAIN,1); test_bail(&cq,r); diff --git a/src/page.h b/src/page.h index a3a0348..6e572ad 100644 --- a/src/page.h +++ b/src/page.h @@ -4,6 +4,27 @@ #include #include "coquet.h" +/* Pages begin with flags discriminating page type, followed by a series of + * zero or more headers determined by type. There is then the data tail. Headers + * are sequenced in the order of the declarations below. + */ + +/* A true root page, a pt_root header follows */ +#define COQUET_PT_ROOT 0x01 + +struct pt_root { + /* TODO nursery id */ + uint64_t book_length; /* Pages to next pt_root, (0 = this is first) */ + uint8_t page_hash[32]; /* HMAC SHA512-256 using global_iv */ + uint8_t section_hash[32]; /* HMAC SHA512-256 using global_iv */ +}; + +struct cq_page { + uint8_t flags; + struct pt_root root; + uint64_t data; +}; + /* byte offset of given main page. Note pgids are 1-based */ off_t cq_offset_main_page(coquet_t *cq, int which_file, u_int64_t pgid); diff --git a/src/superblock.c b/src/superblock.c index 2cd96fc..c3dcafa 100644 --- a/src/superblock.c +++ b/src/superblock.c @@ -194,7 +194,7 @@ static int super_write(coquet_t *cq, struct cq_super *super, return r; } -int cq_super_save(coquet_t *cq, int which_file, struct cq_super *super, bool wait) { +int cq_super_save(coquet_t *cq, int which_file, struct cq_super *super, bool wait, bool sync) { int r, ret; struct cq_super old; @@ -215,7 +215,9 @@ int cq_super_save(coquet_t *cq, int which_file, struct cq_super *super, bool wai } /* sync */ - ret = (cq->vfs_funcs.sync)(cq->vfs_data,COQUET_FILE_MAIN,1); + if(sync) { + ret = (cq->vfs_funcs.sync)(cq->vfs_data,COQUET_FILE_MAIN,1); + } /* unlock */ r = lock_super(cq,which_file,COQUET_LMODE_UN,wait); @@ -281,12 +283,12 @@ void test_superblock_main() { r = cq_super_load(&cq,COQUET_FILE_MAIN,&super,1); test_bail(&cq,r); - cq_super_save(&cq,COQUET_FILE_MAIN,&super,1); + cq_super_save(&cq,COQUET_FILE_MAIN,&super,1,1); test_bail(&cq,r); super.desired.nursery_size = 11; /* change something for B */ cq_super_set_desc(&super,"test file"); - cq_super_save(&cq,COQUET_FILE_MAIN,&super,1); + cq_super_save(&cq,COQUET_FILE_MAIN,&super,1,1); test_bail(&cq,r); test_close(&cq); @@ -338,7 +340,7 @@ void test_superblock_main() { /* check updated in file successfully */ test_open(&cq); - cq_super_save(&cq,COQUET_FILE_MAIN,&super,1); + cq_super_save(&cq,COQUET_FILE_MAIN,&super,1,1); test_close(&cq); test_open(&cq); @@ -372,10 +374,10 @@ static void make_superblock(coquet_t *cq, bool also_b, test_open(cq); r = cq_super_load(cq,COQUET_FILE_MAIN,&super,1); super.current.nursery_size = 12; - cq_super_save(cq,COQUET_FILE_MAIN,&super,1); + cq_super_save(cq,COQUET_FILE_MAIN,&super,1,1); if(also_b) { super.current.nursery_size = 11; - cq_super_save(cq,COQUET_FILE_MAIN,&super,1); + cq_super_save(cq,COQUET_FILE_MAIN,&super,1,1); } if(corrupt>-1) { r = (cq->vfs_funcs.read)(cq->vfs_data,COQUET_FILE_MAIN,&d,corrupt,1); diff --git a/src/superblock.h b/src/superblock.h index 82ff11a..9a2155c 100644 --- a/src/superblock.h +++ b/src/superblock.h @@ -33,7 +33,7 @@ struct cq_super { #include "coquet.h" -int cq_super_save(coquet_t *cq, int which_file, struct cq_super *super, bool wait); +int cq_super_save(coquet_t *cq, int which_file, struct cq_super *super, bool wait, bool sync); int cq_super_load(coquet_t *cq, int which_file, struct cq_super *super, bool create); void cq_super_set_desc(struct cq_super *super, char *desc); char * cq_super_get_desc(struct cq_super *super);