-
-
Notifications
You must be signed in to change notification settings - Fork 15
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
Implement read-snapshots #45
Comments
So currently no snapshot is used whilst reading and you get an inconsistent view (i.e. puts after you start reading reflect in your results) |
actually, sorry, it's |
I think this is off by default, The puts come out in the read stream. |
OK, well we need tests for snapshots anyway so a good start would be a test for the current implementation to see what it's actually doing. I'll try and get to that soon. |
See: Level/levelup@40dbde6#diff-3 You'll need to update your slow-stream in your devDeps to make this one run properly. Basically the test adds in a bunch of data, then creates a The test demonstrates that an "implicit snapshot" indeed means that a snapshot is being created to handle the iterator even without being told to do so. You can verify this further with some debug prints on stream Got any better ideas for a test case on this? Also on that commit you'll see the basics of some snapshot work on the C++ layer, it should be fairly simple to implement but I need some time to make a nice JS interface and some decent tests for it. P.S. if you ever get failed tests, then run again and get passed tests, it's probably a database not being deleted properly from the |
I'm +1 on snapshots exposed in levelup |
Still no support for snapshots? |
see #138 |
At the moment, this is a documentation-only PR, acting as an RFC. In particular I'd like review of my choice to use a token-based approach (as first suggested by Rod Vagg in Level/community#45) as opposed to a dedicated snapshot API surface (as suggested by Julian Gruber in Level/community#47). Main reasons for not choosing the latter: - It would be a third API surface. We have the main database API, the sublevel API which is equal to that except for implementation- specific additional methods, and would now add another API which only has read methods (get, iterator, etc, but not put and batch). If the API was reusable, meaning you could pass around a snapshot as if it was a regular database (like you can with sublevels) then I'd be cool with it. But for that to happen, we'd have to implement transactions as well, which I consider to be out of scope although transactions are in fact a use case of snapshots. - It would have a higher complexity once you factor in sublevels. I.e. to make `db.sublevel().snapshot().get(key)` read from the snapshot but also prefix the given key. By instead doing `db.sublevel().get(key, { snapshot })`, the sublevel can just forward that snapshot option to its parent database. - Furthermore, with the token approach, you can pass a snapshot to multiple sublevels, which cleanly solves the main use case of retrieving data from an index (I included an example in the docs). I renamed the existing snapshot mechanism to "implicit snapshots" and attempted to clarify the behavior of those as well. If accepted, some related issues can be closed, because this PR: - Includes (a more complete write-up than) Level/classic-level#40. - Mentions Level/leveldown#796 (which should be moved rather than closed). - Answers Level/classic-level#28. - Solves the main use case as described in Level/leveldown#486. - Effectively completes Level/awesome#19.
Tracked in #118. |
options.snapshot = NULL;
on an iterator will give a consistent snapshot view of the data while reading.db->GetSnapshot();
will create a snapshot and return a version that can be set againstoptions.snapshot
. The drawback of the latter is that you have to explicitlydb->ReleaseSnapshot()
to clean up versions you've created.At least the
NULL
case would be handy to start with.The text was updated successfully, but these errors were encountered: