diff options
| author | eunhhu <[email protected]> | 2026-09-26 07:47:57 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-26 07:47:57 +0100 |
| commit | 0c47bc2bc2497771740410bcd965d4d4fd0e3524 (patch) | |
| tree | 85e9c24eb25f7f01f465a23cbe3995133e472152 /prototypes/connections/module.c | |
| parent | 4ebd1cd9108b135c1216bc6ae17832b77dcacaf3 (diff) | |
| download | pure-0c47bc2bc2497771740410bcd965d4d4fd0e3524.tar.gz pure-0c47bc2bc2497771740410bcd965d4d4fd0e3524.zip | |
Let a burst hold up to 256 documents
A burst ended once 16 keys had joined it, so 64 writers needed four
commits a round and some waited through several (p50 17.4 ms). The
pending documents now grow on demand up to 256 keys, which also makes
PureApp 1.3 KB smaller (3,128 bytes). With 64 connections a commit now
carries 26 events on average instead of 12 and the median PUT waits
9.2 ms; throughput moves less, since each commit writes more and the SD
card's syncs take most of the time.
Diffstat (limited to 'prototypes/connections/module.c')
| -rw-r--r-- | prototypes/connections/module.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/prototypes/connections/module.c b/prototypes/connections/module.c index f8ebdd3..ebb746f 100644 --- a/prototypes/connections/module.c +++ b/prototypes/connections/module.c @@ -1038,6 +1038,7 @@ void pure_app_stop(PureApp *app) { pure_draft_close(app->list_drafts[i]); } pure_draft_close(app->stored_values); + free(app->pending); pure_undo_free(&app->undo); free(app->arena.bytes); free(app->view_arena.bytes); @@ -1164,6 +1165,13 @@ PureResult pure_app_message(PureApp *app, uint32_t input, const char *key, int64 PureResult saved = pure_app_save(app); if (saved != PURE_OK) return saved; } + if (app->pending_count == app->pending_capacity) { + unsigned capacity = app->pending_capacity ? 2 * app->pending_capacity : 16; + struct PurePending *grown = realloc(app->pending, capacity * sizeof(*grown)); + if (!grown) return PURE_ALLOCATION; + app->pending = grown; + app->pending_capacity = capacity; + } PureResult opened = app->data.open(app->data.context, 0, key, &app->document, &app->revision); if (opened != PURE_OK) { app->document = NULL; return opened; } if (base >= 0 && base != app->revision) { pure_app_finish(app); return PURE_CONFLICT; } |
