- 06 Mar, 2019 4 commits
-
-
Kirill Smelkov authored
Implement invalidation handling to teach DB to reuse Connections from connection pool: after connection is returned to the pool on transaction completion, we can use this connection for next DB.Open(at) request, by seeing which objects we changed in conn.at..at range and invalidating those objects in connection live cache. To know which objects were changed, DB adds watch on its storage and maintains some history tail (using ΔTail - see previous commit). Finally add test for both DB and Connection, and also for Persistent, LiveCache, ... - as all those application-level components are tightly inter-related.
-
Kirill Smelkov authored
Add ΔTail - utility class to keep track of history tail of revisional changes. This will be needed for both DB (to handle invalidations) and for raw Cache(*). It also might be useful in places outside of zodb/go - for example WCFS from Wendelin.core uses ΔTail to keep track of which ZODB revision changed which block of file(+). Please see ΔTail comments for details. (*) to check a bit ahead on load to see whether loaded serial is actually the latest one for ≤ Cache.head, and, if yes, mark corresponding cache entry as having .head="current" so that the entry coverage could be extended when Cache.head is extended to cover more database state instead of loading the same data from the database again. (+) that's why we have δtail.go.cat-generic, so that third-party packages could adapt ΔTail to needed types.
-
Kirill Smelkov authored
We are going to add more options. Adopt "!" prefix as "no" for something. Make the code flow in ConnOptions more suitable for further additions without changing formatter for previous option.
-
Kirill Smelkov authored
DB is a "handle to database". It has to be closed to release its resources when no longer needed. We don't have to release anything currently, but that will soon change in a followup patch.
-
- 20 Feb, 2019 9 commits
-
-
Kirill Smelkov authored
Due to forgotten ... it was not passing prepared argv as argv to fmt.Errorf, but as a single slice argument. The result was messy, for example persistent_test.go:176: deactivate refcnt < 0: panic error unexpected: have: "[t.zodb.MyObject 000000000000000c](%!s(MISSING)): deactivate: refcnt < 0" want: "t.zodb.MyObject(000000000000000c): deactivate: refcnt < 0" Using the occasion add details to deactivate refcnt panic, which made me to discover this bug.
-
Kirill Smelkov authored
Seeing all problems helps to understand what is going on, compared to e.g. if it complains only about .jar being wrong.
-
Kirill Smelkov authored
Persistent.refcnt is int, %s prints it as e.g. %!s(int=1) -> use %d.
-
Kirill Smelkov authored
We are going to use this function in other tests too.
-
Kirill Smelkov authored
We were not actually checking for it and it is hard to check correctly since .loading is transient.
-
Kirill Smelkov authored
Add new `zodb watch` command that is both demonstration of just added ZODB Watch API (see previous patch), and could be useful for a ZODB database administration / monitoring. See zodbtools/watch.go for description.
-
Kirill Smelkov authored
Add initial draft for IStorage-level watch API and implemention: - Notifier goes away; - Add Watcher interface instead with AddWatch/DelWatch calls. See Watcher documentation for details. - IStorage wrapper now subscribes to driver events, retranslate them to users and handles Add/Del watch subscription requests. XXX Raw cache becomes temporarily disabled, until it is fixed to handle invalidations. XXX Tests pending.
-
Kirill Smelkov authored
storage is a wrapper that turns IStorageDriver into IStorage. It will have some logic around almost all IStorageDriver methods. So don't automatically inherit driver methods not to miss some.
-
Kirill Smelkov authored
It is already not only open code there, and we are going to add more storage wrapping functionality into storage (IStorage wrapper over IStorageDriver). Storage.go thus seems to be a better name.
-
- 19 Feb, 2019 4 commits
-
-
Kirill Smelkov authored
This continues 4d2c8b1d (go/zodb: Require drivers to provide notifications for database change events) and a6580062 (go/zodb: Require drivers to provide at₀ on open) and reworks watchq to receive not only commit events, but also errors from watcher in storage driver.
-
Kirill Smelkov authored
Similarly to zodb (632c9798 "go/zodb: storageURL -> zurl")
-
Kirill Smelkov authored
This are equivalents of PersistentMapping and PersistentList in ZODB/py. PersistentMapping is usually used as root ZODB object in Zope/ERP5/... At least we should be able to load and save them now. Tests pending...
-
Kirill Smelkov authored
zurl is more handy and is also used in zodbtools which have help on it (`zodb help zurl`).
-
- 18 Feb, 2019 5 commits
-
-
Kirill Smelkov authored
BTrees.Length.Length is used in many places in ERP5. At least we should be able to load and save it now.
-
Kirill Smelkov authored
Tests pending.
-
Kirill Smelkov authored
This functions invoke visit callback on every BTree node they traverse. Wendelin.core needs this to retrieve serials of not only looked up ZBlk object, but also of every BTree nodes on the path to it.
-
Kirill Smelkov authored
go/zodb/btree: Bucket.Get: Don't get ctx argument and just require that the bucket must be already activated It was scheduled to be so as described in removed TODO.
-
Kirill Smelkov authored
It is either BTree or Bucket.
-
- 05 Feb, 2019 3 commits
-
-
Kirill Smelkov authored
This will allow persistency layer to do kind of copy-on-write, if e.g. there are many connections that are sharing object's state.
-
Kirill Smelkov authored
Continuing previous patch also teach ZEO to decode identifies from on-wire as both [8]str or [8]byte. Tests pending.
-
Kirill Smelkov authored
Since ZODB 5.4 OID is encoded as bytes, not str: https://github.com/zopefoundation/ZODB/commit/12ee41c473 Try to support both str and bytes on decoding, as we need to support all ZODB versions.
-
- 01 Feb, 2019 3 commits
-
-
Kirill Smelkov authored
Add a way for tests to serialize and commit IPersistent objects. The commit, for now, is implemented via calling external zodbtools/py to commit raw data (see 7f14e2cb "go/zodb/fs1: tests: Factor-out commiting a transaction via ZODB/py into common place). The data to commit is what object serialization (see previous patch) gives. For now there is no tracking of dirtiness. A test must explicitly list objects it wants to save into database. This functionality will soon be used to implement Persistent/DB/... tests.
-
Kirill Smelkov authored
This will be used in the future to commit object changes back into database. No test, since this functionality will be used at first to implement tests themselves (see next patch). Hopefully after bootstrapping we'll have full tests.
-
Kirill Smelkov authored
- require (Py)GetState and make it clear that it is called by persistency machinery only on non-ghost objects. - make it clear that (Py)SetState is called by persistency machinery only on ghost objects. - make it clear that DropState is called by persistency machinery only on non-ghost objects. For btree PyGetState is marked as TODO which we'll fill incrementally (the code is draftly ready, but there is no test for now).
-
- 30 Jan, 2019 3 commits
-
-
Kirill Smelkov authored
We will soon need to be able to commit in tests for ZODB itself.
-
Kirill Smelkov authored
and to deliver to watchq only and all events in (at₀, +∞] range. This continues 4d2c8b1d (go/zodb: Require drivers to provide notifications for database change events) and makes initialization semantics to process invalidations easier for both application-level ZODB layer, and for low-level users that work with drivers directly: - there is no possibility that an event will come from watchq with tid < current user head. - there is no possibility that watcher will start delivering events after at₀, but not immediately after it, i.e. users can rely that they won't loose an event. This correctness invariants should be easy to provide in drivers.
-
Kirill Smelkov authored
pool is a better name for "pool of unused connections" compared to connv.
-
- 29 Jan, 2019 2 commits
-
-
Kirill Smelkov authored
Connection has .db and db has .stor - there is no need to keep separate .stor on the Connection. This thinko was there from Connection beginning (533f0c73 "go/zodb: DB - application-level handle to database (very draft)")
-
Kirill Smelkov authored
There was a thinko in transaction.Abort - it was spawning synchronizers under a waitgroup, but wg.Wait() call was forgotten. This way, e.g. in ZODB if a transaction was aborted, corresponding connection could be not yet returned back into DB pool. Fix it. Test is TODO for the time when, hopefully, tracetest is generally ready.
-
- 28 Jan, 2019 1 commit
-
-
Kirill Smelkov authored
In ZODB transaction ID is connected with time. We already have functionality to convert tid to time (see bac6c953 "go/zodb: Tid connection with time"), but the functionality for converting in another way - time -> tid - was missing. Fix it.
-
- 18 Jan, 2019 6 commits
-
-
Kirill Smelkov authored
It is useful in situations where one need to print potentially Broken objects properly, because %T does not print that detail and using %#v creates too much noise.
-
Kirill Smelkov authored
This allows for applications to tune eviction strategy for their needs. The interface to do so (LiveCacheControl) was defined previously in c67ff9ea (go/zodb: Connection: Allow applications to tune live-cache eviction policy), but so far there was no way to install cache controller. Fix it.
-
Kirill Smelkov authored
Wendelin.core (wcfs) needs to check whether an object is currently cached or not.
-
Kirill Smelkov authored
Following-up on 4d2c8b1d (go/zodb: Require drivers to provide notifications for database change events) let's teach FileStorage to support watching for database changes: - add watcher who observes changes to data file via fsnotify. - when we see that the file was updated - there is a tricky case to distinguish in-progress writes from just some garbage added at tail. See comments in _watcher for details. - if the watcher sees there is indeed new transactions, the watcher updates index & txnh{Min,Max} and sends corresponding event to watchq. - since index / txnh{Min,Max} can now be changed (by watcher) -> they are now protected by mu. - consequently operations like LastTid, LastOid, Load, ... are all taught to observe index / txnh{Min,Max} state in read-snapshot way. - add down & friends to indicate that the storage is no longer operational, if watcher sees there is a problem with data file. - Open is reworked to start from loading/rebuilding index first, and then tail to watcher to detect whether what's after found topPos is garbage or another in-progress transaction. Consequently it is now possible to correctly open filestorage that is being currently written to and has in-progress transaction at tail. The patch is a bit big, but the changes here are all tightly interrelated.
-
Kirill Smelkov authored
It is already 3 places where we return zodb.OpError and it will be more. Make a helper function to create those errors with higher signal/noise.
-
Kirill Smelkov authored
A ZODB database can be changed by local client as well as another process. A notification channel is thus needed for local cache and database view to know they have to update to current database state. This patch builds the interface of how such notifications should be provided by drivers. Contrary to ZODB/py it is required that every driver provide it. However we will be providing driver support incrementally and for now all drivers behave as if the database is not changing. A note on why Watchq is passed to driver as options: low-level ZODB users, who might want to work with drivers directly, might not need it, and this way with Watchq not present in driver options they will continue to observe the same driver behaviour as before watchq was introduced. In practice many low-level utilities don't need notification support, and it would be not good to required them all to update open calls and to provide watchq drainer not to get stuck. TODO Watchq should be extended to also receive errors from watcher, so that clients could be notified when there is something wrong with the database.
-