1. 10 Mar, 2019 1 commit
    • Kirill Smelkov's avatar
      go/zodb: LastTid -> Sync + Head · 151d8b79
      Kirill Smelkov authored
      Today LastTid is ambiguous: does it return locally cached last transaction ID,
      or it performs round-trip to server to get more uptodate view of what has been
      last committed? As the result of this ambiguity some drivers (e.g. FileStorage,
      ZEO) return cached view, while other drivers (upcoming NEO, living on t branch)
      was doing the full round-trip.
      
      There are also situations where whether or not LastTid performs syncing to
      server affects semantics: for example if there are two ERP5 nodes and one
      node commits something into ZODB and conveys the fact that something has been
      committed via another channel, the second ERP5 node should have a reliable way
      to observe committed data. But currently there is no such way: on next DB.Open,
      even with at=0 meaning "use latest transaction" and with opt.NoSync=false,
      DB.Open uses storage.LastTid() as a way to sync and oops - for some drivers it
      won't result in real synchronization and thus opened connection could
      potentially have older view with not yet latest data.
      
      To fix this ambiguity require drivers to provide Sync functionality only. That
      should return ID of last transaction committed to storage data as observed from
      some time _afterwards_ Sync call was made. In other words for particular
      client-server case, Sync cannot return cached view of storage and has to
      perform round-trip to the server.
      
      At IStorage level we provide two entry points: Sync, to perform syncing, and
      Head that returns database head (last transaction ID) as viewed by local cache
      without any synchronization.
      
      Please see changes to IStorageDriver and IStorage interfaces for details.
      
      The rest of the changes are:
      
      - teach zodb.storage (the IStorage implementer) to actually implement Sync/Head.
      - adapt zodb.DB to perform Sync for !opt.NoSync case.
      - teach FileStorage to do proper syncing instead of returning local cache.
      - teach ZEO to perform "lastTransaction" RPC call for syncing instead of
        returning local cache.
      - adapt the rest of the tree to interfaces change.
      151d8b79
  2. 08 Mar, 2019 2 commits
    • Kirill Smelkov's avatar
      go/zodb: DB: preserve δtail not to go down to ø slice on seldom commits · 4224b580
      Kirill Smelkov authored
      If we use only the rule that we keep last 10 minutes of database
      history, and commits come less often than that - e.g. once per 30
      minutes, on every new commit we'll be throwing away all δtail data,
      which would result on completely throwing away live cache on every
      DB.Open .
      
      Add another rule to cover seldom updates spectrum so that we never throw
      till empty δtail and keep at least 10 elements in δtail queue. This will
      make sure that live cache is preserved even when updates to database are
      seldom to come.
      
      Tests pending...
      4224b580
    • Kirill Smelkov's avatar
      go/zodb: ΔTail += Data() · 8ee32480
      Kirill Smelkov authored
      This gives access to raw data stored in ΔTail. We'll need this in the
      next commit, as well as going through raw δtail data is also generally
      useful.
      8ee32480
  3. 06 Mar, 2019 6 commits
    • Kirill Smelkov's avatar
      go/zodb/*: Cosmetics, typos, ... · 60682993
      Kirill Smelkov authored
      60682993
    • Kirill Smelkov's avatar
      go/zodb: Connection.Resync · bae8fda6
      Kirill Smelkov authored
      Add low-level option to resync Connection to another database state with
      preserving its live cache.
      
      Wendelin.core needs this for its main ZODB connection because it needs
      to carefully propagate ZODB invalidations into file invalidations and
      semantically relies on objects staying in ZODB live cache for this to
      work correctly:
      
      https://lab.nexedi.com/kirr/wendelin.core/blob/455a54425c/wcfs/wcfs.go#L245
      bae8fda6
    • Kirill Smelkov's avatar
      go/zodb: DB: handle invalidations · 918455e7
      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.
      918455e7
    • Kirill Smelkov's avatar
      go/zodb: ΔTail · d8e9d7a9
      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.
      d8e9d7a9
    • Kirill Smelkov's avatar
      go/zodb: ↑ SNR for ConnOptions · 030b0c42
      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.
      030b0c42
    • Kirill Smelkov's avatar
      go/zodb: Require DB to be closed · 2f5e3606
      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.
      2f5e3606
  4. 20 Feb, 2019 9 commits
  5. 19 Feb, 2019 4 commits
  6. 18 Feb, 2019 5 commits
  7. 05 Feb, 2019 3 commits
  8. 01 Feb, 2019 3 commits
    • Kirill Smelkov's avatar
      go/zodb: tests: Provide way to commit IPersistent objects · 42118074
      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.
      42118074
    • Kirill Smelkov's avatar
      go/zodb: Teach Persistent to serialize itself · a16c9e06
      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.
      a16c9e06
    • Kirill Smelkov's avatar
      go/zodb: Complete (Py)Stateful & Ghostable · e020026a
      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).
      e020026a
  9. 30 Jan, 2019 3 commits
    • Kirill Smelkov's avatar
      go/zodb/fs1: tests: Factor-out commiting a transaction via ZODB/py into common place · 7f14e2cb
      Kirill Smelkov authored
      We will soon need to be able to commit in tests for ZODB itself.
      7f14e2cb
    • Kirill Smelkov's avatar
      go/zodb: Require drivers to provide at₀ on open · a6580062
      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.
      a6580062
    • Kirill Smelkov's avatar
      go/zodb: DB.connv -> DB.pool · 2799f995
      Kirill Smelkov authored
      pool is a better name for "pool of unused connections" compared to connv.
      2799f995
  10. 29 Jan, 2019 2 commits
    • Kirill Smelkov's avatar
      go/zodb: Connection -= .stor · 0806740d
      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)")
      0806740d
    • Kirill Smelkov's avatar
      go/transaction: Fix Abort to wait for synchronizers completion · 7e0c944f
      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.
      7e0c944f
  11. 28 Jan, 2019 1 commit
    • Kirill Smelkov's avatar
      go/zodb += TidFromTime · a9e2badf
      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.
      a9e2badf
  12. 18 Jan, 2019 1 commit