diff options
| author | 郑超 <[email protected]> | 2023-12-07 11:21:20 +0000 |
|---|---|---|
| committer | 郑超 <[email protected]> | 2023-12-07 11:21:20 +0000 |
| commit | 7332c66226edb71bfa210428571bb7ad49bcb2e6 (patch) | |
| tree | 4bee689e8e8e0503a96c9a9b665720bde73f885a /src | |
| parent | 4008e3509a4a500bed26fdcb4b03ce7d05cc77e2 (diff) | |
The staggered HyperLogLog does not slide during queries and merges, leading to inaccurate token assignments in the fair/bulk token bucket. Using obj_replicate instead of obj_new for a straightforward CRDT replication.v4.0.3
Diffstat (limited to 'src')
| -rw-r--r-- | src/swarmkv_store.c | 51 |
1 files changed, 15 insertions, 36 deletions
diff --git a/src/swarmkv_store.c b/src/swarmkv_store.c index 987cfd4..79be1ab 100644 --- a/src/swarmkv_store.c +++ b/src/swarmkv_store.c @@ -21,36 +21,12 @@ struct swarmkv_obj_specs { enum sobj_type type; const char *type_name; - void *(*obj_new) (uuid_t uuid); void (*obj_free) (void *obj); void (*obj_serialize) (const void *obj, char **blob, size_t *blob_sz); void (*obj_merge_blob) (void *obj, const char *blob, size_t blob_sz); + void *(*obj_replicate) (uuid_t uuid, const char *blob, size_t blob_sz); size_t (*obj_size)(const void *obj); }; -static void *__wrap_OC_token_bucket_new(uuid_t uuid) -{ - struct OC_token_bucket *bucket=NULL; - struct timeval beginning_of_history; - memset(&beginning_of_history, 0, sizeof(beginning_of_history)); - bucket=OC_token_bucket_new(uuid, beginning_of_history, 0, 0); - return bucket; -} -static void *__wrap_fair_token_bucket_new(uuid_t uuid) -{ - struct fair_token_bucket *bucket=NULL; - struct timeval beginning_of_history; - memset(&beginning_of_history, 0, sizeof(beginning_of_history)); - bucket=fair_token_bucket_new(uuid, beginning_of_history, 0, 0, 0); - return bucket; -} -static void *__wrap_bulk_token_bucket_new(uuid_t uuid) -{ - struct bulk_token_bucket *bucket=NULL; - struct timeval beginning_of_history; - memset(&beginning_of_history, 0, sizeof(beginning_of_history)); - bucket=bulk_token_bucket_new(uuid, beginning_of_history, 0, 0, 0); - return bucket; -} size_t undefined_obj_mem_size(void *obj) { return 0; @@ -65,73 +41,73 @@ struct swarmkv_obj_specs sobj_specs[__SWARMKV_OBJ_TYPE_MAX] = { .type=OBJ_TYPE_STRING, .type_name="string", - .obj_new=(void * (*)(unsigned char *))LWW_register_new, .obj_free=(void (*)(void *))LWW_register_free, .obj_serialize=(void (*)(const void *, char **, size_t *))LWW_register_serialize, .obj_merge_blob=(void (*)(void *, const char *, size_t))LWW_register_merge_blob, - .obj_size=(size_t (*)(const void *))LWW_regeister_mem_size + .obj_replicate=(void * (*)(uuid_t, const char *, size_t))LWW_register_replicate, + .obj_size=(size_t (*)(const void *))LWW_register_mem_size }, { .type=OBJ_TYPE_INTEGER, .type_name="integer", - .obj_new=(void * (*)(unsigned char *))PN_counter_new, .obj_free=(void (*)(void *))PN_counter_free, .obj_serialize=(void (*)(const void *, char **, size_t *))PN_counter_serialize, .obj_merge_blob=(void (*)(void *, const char *, size_t))PN_counter_merge_blob, + .obj_replicate=(void * (*)(uuid_t, const char *, size_t))PN_counter_replicate, .obj_size=(size_t (*)(const void *))PN_counter_mem_size }, { .type=OBJ_TYPE_SET, .type_name="set", - .obj_new=(void * (*)(unsigned char *))OR_set_new, .obj_free=(void (*)(void *))OR_set_free, .obj_serialize=(void (*)(const void *, char **, size_t *))OR_set_serialize, .obj_merge_blob=(void (*)(void *, const char *, size_t))OR_set_merge_blob, + .obj_replicate=(void * (*)(uuid_t, const char *, size_t))OR_set_replicate, .obj_size=(size_t (*)(const void *))OR_set_mem_size }, { .type=OBJ_TYPE_HASH, .type_name="hash", - .obj_new=(void * (*)(unsigned char *))OR_map_new, .obj_free=(void (*)(void *))OR_map_free, .obj_serialize=(void (*)(const void *, char **, size_t *))OR_map_serialize, .obj_merge_blob=(void (*)(void *, const char *, size_t))OR_map_merge_blob, + .obj_replicate=(void * (*)(uuid_t, const char *, size_t))OR_map_replicate, .obj_size=(size_t (*)(const void *))OR_map_mem_size }, { .type=OBJ_TYPE_TOKEN_BUCKET, .type_name="token-bucket", - .obj_new=__wrap_OC_token_bucket_new, .obj_free=(void (*)(void *))OC_token_bucket_free, .obj_serialize=(void (*)(const void *, char **, size_t *))OC_token_bucket_serialize, .obj_merge_blob=(void (*)(void *, const char *, size_t))OC_token_bucket_merge_blob, + .obj_replicate=(void * (*)(uuid_t, const char *, size_t))OC_token_bucket_replicate, .obj_size=(size_t (*)(const void *))OC_token_bucket_mem_size, }, { .type=OBJ_TYPE_FAIR_TOKEN_BUCKET, .type_name="fair-token-bucket", - .obj_new=__wrap_fair_token_bucket_new, .obj_free=(void (*)(void *))fair_token_bucket_free, .obj_serialize=(void (*)(const void *, char **, size_t *))fair_token_bucket_serialize, .obj_merge_blob=(void (*)(void *, const char *, size_t))fair_token_bucket_merge_blob, + .obj_replicate=(void * (*)(uuid_t, const char *, size_t))fair_token_bucket_replicate, .obj_size=(size_t (*)(const void *))fair_token_bucket_mem_size, }, { .type=OBJ_TYPE_BULK_TOKEN_BUCKET, .type_name="bulk-token-bucket", - .obj_new=__wrap_bulk_token_bucket_new, .obj_free=(void (*)(void *))bulk_token_bucket_free, .obj_serialize=(void (*)(const void *, char **, size_t *))bulk_token_bucket_serialize, .obj_merge_blob=(void (*)(void *, const char *, size_t))bulk_token_bucket_merge_blob, + .obj_replicate=(void * (*)(uuid_t, const char *, size_t))bulk_token_bucket_replicate, .obj_size=(size_t (*)(const void *))bulk_token_bucket_mem_size }, { .type=OBJ_TYPE_UNDEFINED, .type_name="undefined", - .obj_new=NULL, .obj_free=undefined_obj_free, .obj_serialize=NULL, .obj_merge_blob=NULL, + .obj_replicate=NULL, .obj_size=(size_t (*)(const void *))undefined_obj_mem_size } }; @@ -440,9 +416,12 @@ void sobj_merge_blob(struct sobj *obj, const char *blob, size_t blob_sz, uuid_t const char *value_blob=blob+offset; if(!obj->raw) { - obj->raw=sobj_specs[obj->type].obj_new(uuid); + obj->raw=sobj_specs[obj->type].obj_replicate(uuid, value_blob, value_blob_sz); + } + else + { + sobj_specs[obj->type].obj_merge_blob(obj->raw, value_blob, value_blob_sz); } - sobj_specs[obj->type].obj_merge_blob(obj->raw, value_blob, value_blob_sz); return; } |
