Skip to content

Marking SimpleDb calls as idempotent #2251

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

Merged
merged 10 commits into from
Oct 10, 2019

Conversation

schmidt-sebastian
Copy link
Contributor

This PR marks all straightforward calls of SimpleDb.runTransaction as idempotent. Most of the usage is in test.

This was verified via a manual code audit and via a test hack (not checked in) that fails the first run of idempotent transactions.

@schmidt-sebastian schmidt-sebastian changed the base branch from mrschmidt/retry to mrschmidt/idempotent October 10, 2019 18:46
Copy link
Contributor

@wilhuff wilhuff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@@ -184,6 +184,7 @@ async function assertOrdered(paths: ResourcePath[]): Promise<void> {

const selected: string[] = [];
await runTransaction(simpleStore => {
selected.splice(0); // The function might get re-run.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would be cleaner if the selected array were just returned from the transaction.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's much cleaner. Updated.

@@ -329,7 +329,7 @@ export class IndexedDbPersistence implements Persistence {
})
.then(() => {
return this.simpleDb.runTransaction(
'readonly',
'readonly-idempotent',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This appears to modify this.listenSequence in the transaction.

Why not move that out of the transaction and into the first then block below?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are a bunch of calls in the SDK that follow this pattern and re-compute a value inside a transaction, but the re-computation has no side effects. In this case, refactoring the change out of this transaction is pretty simple, so I applied the change. It might not always be so simple in other cases though.

@schmidt-sebastian schmidt-sebastian merged commit 1383598 into mrschmidt/idempotent Oct 10, 2019
@wilhuff wilhuff assigned schmidt-sebastian and unassigned wilhuff Oct 10, 2019
@schmidt-sebastian schmidt-sebastian deleted the mrschmidt/simpleidempotent branch October 10, 2019 22:54
hsubox76 pushed a commit that referenced this pull request Oct 15, 2019
* Add transaction retries (#2250)

* Marking SimpleDb calls as idempotent (#2251)

* Mark mostly readonly calls as idempotent (#2252)

* Fix test failure (#2256)

* Make handleUserChange idempotent (#2257)

* Temporarily disable CountingQueryEngine tests (#2258)

*  Improve test hack (#2259)

* Improve test hack

* Comment in test hack

* Make getNewDocumentChanges() idempotent (#2255)

* Add onCommitted listeners for transactions (#2265)

* Fix build

* Fix Lint

* Make applyRemoteEvent idempotent (#2263)

* Make notifyLocalViewChanges idempotent (#2268)

* Make releaseQuery idempotent (#2266)

* Mark acknowledgeBatch and rejectBatch idempotent (#2269)

* idempotent `allocateQuery` and `notifyLocalViewChanges` (#2264)

* Mark collectGarbage idempotent (#2267)

* Idempotency: Address TODOs, add Changelog (#2270)
@firebase firebase locked and limited conversation to collaborators Nov 10, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants