Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: fix file storage race condition #388

Merged
merged 84 commits into from
Nov 28, 2023
Merged

Conversation

gmaclennan
Copy link
Member

@gmaclennan gmaclennan commented Nov 24, 2023

Stacked on #386 -> #362

Fixes #387

Switching to file storage exposes a race condition when writing documents (create or update). The indexer relies on the hypercore append event, which can fire before core.append() resolves, which results in the indexer batch function resolving before core.append() resolves. Because we wait for the indexer to index the document before resolving the create or update method, this situation leads to a hang. The clunky solution is to await any pending appends first, so that we know that the deferred promise is set, and then the indexer batch can resolve it.

Switching to file storage unfortunately causes the e2e sync tests to fail because of other reasons - sometimes the indexing does not complete before we read the synced docs, which results in failed tests. Because of this, in this PR I have switched off file storage for tests. With file storage on (FAST_TESTS set to false), the project-crud.js test passes (it does not before this PR), but the sync.js is failing. This is fixed by #389 (stacked on this PR), which turns on file storage for tests.

For now this simplifies the API (because we are only supporting local
sync, not remote sync over the internet) to:

- `project.$sync.getState()`
- `project.$sync.start()`
- `project.$sync.stop()`
- Events
    - `sync-state`

It's currently not possible to stop local discovery, nor is it possible
to stop sync of the metadata namespaces (auth, config, blobIndex). The
start and stop methods stop the sync of the data and blob namespaces.

Fixes #134. Stacked on #360, #358 and #356.
Fixes Add project method to download auth + config cores #233

Rather than call this inside the `client.addProject()` method, instead I
think it is better for the API consumer to call
`project.$waitForInitialSync()` after adding a project, since this
allows the implementer to give user feedback about what is happening.
This was a big lift, but necessary to be able to debug sync issues since
temporarily adding console.log statements was too much work, and
debugging requires knowing the deviceId associated with each message.
This caused a day of work: a bug from months back
gmaclennan added a commit that referenced this pull request Nov 28, 2023
* main:
  fix: fix file storage race condition (#388)
  feat: remove project.ready() (#392)
  feat: integrate sync and project invites (#362)
gmaclennan added a commit that referenced this pull request Nov 28, 2023
* main:
  fix: wait for index idle before returning data (#389)
  fix: fix file storage race condition (#388)
  feat: remove project.ready() (#392)
  feat: integrate sync and project invites (#362)
gmaclennan added a commit that referenced this pull request Nov 29, 2023
* main:
  fix: wait for index idle before returning data (#389)
  fix: fix file storage race condition (#388)
  feat: remove project.ready() (#392)
  feat: integrate sync and project invites (#362)
gmaclennan added a commit that referenced this pull request Nov 29, 2023
* main:
  fix: wait for index idle before returning data (#389)
  fix: fix file storage race condition (#388)
  feat: remove project.ready() (#392)
  feat: integrate sync and project invites (#362)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Using file storage results in race conditions that cause db writes to fail
2 participants