1. 05 Feb, 2019 2 commits
  2. 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
  3. 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
  4. 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
  5. 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
  6. 18 Jan, 2019 6 commits
    • Kirill Smelkov's avatar
      go/zodb: Expose retrieving ZODB class name of a Go object as public API · 2f061c0c
      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.
      2f061c0c
    • Kirill Smelkov's avatar
      go/zodb: Allow to set live cache control policy · cab4dd52
      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.
      cab4dd52
    • Kirill Smelkov's avatar
      go/zodb: Expose access to connection's live cache as public API · e2d902b0
      Kirill Smelkov authored
      Wendelin.core (wcfs) needs to check whether an object is currently
      cached or not.
      e2d902b0
    • Kirill Smelkov's avatar
      go/zodb/fs1: Teach it to support notifications on database change · db852511
      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.
      db852511
    • Kirill Smelkov's avatar
      go/zodb/fs1: Factor out making zodb.OpError into FileStorage.zerr · 8eb0988e
      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.
      8eb0988e
    • Kirill Smelkov's avatar
      go/zodb: Require drivers to provide notifications for database change events · 4d2c8b1d
      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.
      4d2c8b1d
  7. 17 Jan, 2019 9 commits
  8. 13 Dec, 2018 1 commit
  9. 04 Dec, 2018 1 commit
  10. 08 Oct, 2018 9 commits
  11. 02 Oct, 2018 1 commit
  12. 01 Oct, 2018 1 commit
    • Kirill Smelkov's avatar
      go/zodb: Don't truncate Tid time precision to 1µs · 9112f21e
      Kirill Smelkov authored
      The format of tid assumes ~ ns precision, and it is only formatted to µs
      precision by default. So don't truncate TimeStamp value when computing
      it from Tid, and perform the µs-rounding only on formatting.
      
      The float numbers are not always exactly as in python. For example the
      following program
      
      	tidv = [
      	    0x0000000000000000,
      	    0x0285cbac258bf266,
      	    0x0285cbad27ae14e6,
      	    0x037969f722a53488,
      	    0x03b84285d71c57dd,
      	    0x03caa84275fc1166,
      	]
      
      	for tid in tidv:
      	    t = TimeStamp.TimeStamp(p64(tid))
      	    print '0x%016x %s %.9f\t%.9f' % (tid, t, t.timeTime(), t.second())
      
      prints:
      
      	0x0000000000000000 1900-01-01 00:00:00.000000 -2208988800.000000000     0.000000000
      	0x0285cbac258bf266 1979-01-03 21:00:08.800000 284245208.800000191       8.800000185
      	0x0285cbad27ae14e6 1979-01-03 21:01:09.300001 284245269.300001621       9.300001496	<-- ex here
      	0x037969f722a53488 2008-10-24 05:11:08.120000 1224825068.119999886      8.119999878
      	0x03b84285d71c57dd 2016-07-01 09:41:50.416574 1467366110.416574001      50.416573989
      	0x03caa84275fc1166 2018-10-01 16:34:27.652650 1538411667.652649879      27.652650112
      
      the difference is due to floating point operation ordering, because
      TimeStamp.timeTime() looses precision - e.g. for marked case:
      
      	In [8]: '%.10f' % (281566860.000000000 + 9.300001496)
      	Out[8]: '281566869.3000015020'
      
      We don't try to mimic float64 behaviour to Python exactly - because it is even
      different for PURE_PYTHON=y or C TimeStamp implementations. However we don't
      limit due to that our timestamp precision to only 1µs.
      
      In other words we keep on maintaining exact compatibility with Python on
      printing, but timestamp values itself are now ~ ns precision.
      9112f21e
  13. 28 Sep, 2018 1 commit
    • Kirill Smelkov's avatar
      go/zodb/fs1/index: Don't rely on []byte being pickled as string · c72aaa0d
      Kirill Smelkov authored
      As https://github.com/kisielk/og-rek/pull/57 maybe shows []byte was
      pickling as string only unintentionally and that might change.
      
      We are already explicitly checking for string in corresponding index
      load place:
      
      	https://lab.nexedi.com/kirr/neo/blob/2dba8607/go/zodb/storage/fs1/index.go#L282
      
      so it is better we also explicitly save the bits as string.
      
      If we don't and https://github.com/kisielk/og-rek/pull/57 gets accepted,
      tests will fail:
      
      	--- FAIL: TestIndexSaveLoad (0.00s)
      	    index_test.go:176: index load: /tmp/t-index893650059/458967662/1.fs.index: pickle @6: invalid oidPrefix: type []uint8
      	Traceback (most recent call last):
      	  File "./py/indexcmp", line 41, in <module>
      	    main()
      	  File "./py/indexcmp", line 29, in main
      	    d2 = fsIndex.load(path2)
      	  File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/fsIndex.py", line 138, in load
      	    data[ensure_bytes(k)] = fsBucket().fromString(ensure_bytes(v))
      	  File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/fsIndex.py", line 71, in ensure_bytes
      	    return s.encode('ascii') if not isinstance(s, bytes) else s
      	AttributeError: 'bytearray' object has no attribute 'encode'
      	--- FAIL: TestIndexSaveToPy (0.04s)
      	    index_test.go:218: zodb/py read/compare index: exit status 1
      c72aaa0d