1. 11 Jan, 2005 4 commits
  2. 07 Jan, 2005 2 commits
    • Tim Peters's avatar
      Merge rev 28769 from 3.3 branch. · c0f54ead
      Tim Peters authored
      Forward-port from ZODB 3.2.
      
      Collector 1503:  excessive logging.
      
      ClientStorage._wait_sync():  Don't log more than one "waiting for cache
      verification to finish" message per 5 minutes.
      c0f54ead
    • Tim Peters's avatar
      Forward-port from ZODB 3.2. · b31888e6
      Tim Peters authored
      Collector 1503:  excessive logging.
      
      ClientStorage._wait_sync():  Don't log more than one "waiting for cache
      verification to finish" message per 5 minutes.
      b31888e6
  3. 23 Dec, 2004 2 commits
    • Tim Peters's avatar
      Merge rev 28701 from 3.3 branch. · cca70844
      Tim Peters authored
      Critical bugfix for invalidations during ZEO cache verification.
      
      ClientCache.invalidate():
      
      - This was written not to expect tid=None, which is what happens
        during cache verification, although it didn't catch the tid=None
        case and went on doing really strange things then.  Rewrote so
        that tid=None means "forget everything I think I know about
        the oid".  It was kind-of performing an invalidation wrt the
        in-memory data structures in this case, but leaving the
        invalidated data for oid looking as if it were still current on
        disk.  That was accidental, depending on what various other
        parts of the code thought "None" meant (primarily, an end_tid
        of None is generally taken here to mean "the data is current").
        
      - Also changed the "and we already have version data for oid" case
        to a "forget everything I think I know about the oid" case.  The
        comments seemed to say that's what it thought it was doing, but
        the code actually left non-current revisions sitting around.  I
        really don't want to spend time trying to figure out what versions
        are supposed to do in all cases here, and nuking everything in
        this case is an obviously *safe* thing to do.
      
      - Added more asserts, because the pre- and post-conditions here are
        delicate and non-obvious (indeed, that a new assert failed is how
        I stumbled into the invalidation problem to begin with).
      
      FileCache.remove():  Changed to remove the key from self.key2entry.
      While self.filemap keeps an in-memory map of the entire disk file,
      there's no need to keep info in key2entry for keys that no longer
      exist in the disk file.  I'm not sure a visible bug followed from
      this (but not sure one didn't either!), but it at best wasted
      memory, and violated a documented invariant.
      
      ConnectionTests.py:  New test checkVerificationInvalidationPersists().
      Before the patch, this provokes a persistent ZEO cache into
      delivering stale object state.  Of course the test passes after
      this patch.
      
      stats.py:  Added a trace code meaning "invalidation hit, and the
      object state was discarded".  This is what happens now for
      invalidations produced by verification.  Because of MVCC, that's
      really not needed *except* for the invalidations produced by
      startup verification (invalidations normally just set a new
      ending tid on the validity range for what was current data; but
      validity-range info isn't available from verification invalidations).
      
      cca70844
    • Tim Peters's avatar
      Critical bugfix for invalidations during ZEO cache verification. · 3809711b
      Tim Peters authored
      ClientCache.invalidate():
      
      - This was written not to expect tid=None, which is what happens
        during cache verification, although it didn't catch the tid=None
        case and went on doing really strange things then.  Rewrote so
        that tid=None means "forget everything I think I know about
        the oid".  It was kind-of performing an invalidation wrt the
        in-memory data structures in this case, but leaving the
        invalidated data for oid looking as if it were still current on
        disk.  That was accidental, depending on what various other
        parts of the code thought "None" meant (primarily, an end_tid
        of None is generally taken here to mean "the data is current").
        
      - Also changed the "and we already have version data for oid" case
        to a "forget everything I think I know about the oid" case.  The
        comments seemed to say that's what it thought it was doing, but
        the code actually left non-current revisions sitting around.  I
        really don't want to spend time trying to figure out what versions
        are supposed to do in all cases here, and nuking everything in
        this case is an obviously *safe* thing to do.
      
      - Added more asserts, because the pre- and post-conditions here are
        delicate and non-obvious (indeed, that a new assert failed is how
        I stumbled into the invalidation problem to begin with).
      
      FileCache.remove():  Changed to remove the key from self.key2entry.
      While self.filemap keeps an in-memory map of the entire disk file,
      there's no need to keep info in key2entry for keys that no longer
      exist in the disk file.  I'm not sure a visible bug followed from
      this (but not sure one didn't either!), but it at best wasted
      memory, and violated a documented invariant.
      
      ConnectionTests.py:  New test checkVerificationInvalidationPersists().
      Before the patch, this provokes a persistent ZEO cache into
      delivering stale object state.  Of course the test passes after
      this patch.
      
      stats.py:  Added a trace code meaning "invalidation hit, and the
      object state was discarded".  This is what happens now for
      invalidations produced by verification.  Because of MVCC, that's
      really not needed *except* for the invalidations produced by
      startup verification (invalidations normally just set a new
      ending tid on the validity range for what was current data; but
      validity-range info isn't available from verification invalidations).
      3809711b
  4. 22 Dec, 2004 2 commits
    • Tim Peters's avatar
      Merge rev 28685 from 3.3 branch. · eee5f974
      Tim Peters authored
      Collector 1536:  ClientStorage.__init__ ignores cache_size.
      
      Also split test checkRollover into two tests,
      checkDisconnectedCacheWorks (persistent ZEO cache large enough
      to satisfy all requests) and checkDisconnectedCacheFails (cache
      too small to satisfy all requests while disconnected).
      eee5f974
    • Tim Peters's avatar
      Collector 1536: ClientStorage.__init__ ignores cache_size. · 3c9f4c38
      Tim Peters authored
      Also split test checkRollover into two tests,
      checkDisconnectedCacheWorks (persistent ZEO cache large enough
      to satisfy all requests) and checkDisconnectedCacheFails (cache
      too small to satisfy all requests while disconnected).
      3c9f4c38
  5. 21 Dec, 2004 10 commits
    • Tim Peters's avatar
      Merge rev 28680 from 3.3 branch. · acf7ef56
      Tim Peters authored
      More cleanup, and a new problem.  Notable:
      
      Object.serialize_header():  Stopped stuffing the version string into this
      notion of "a header".  Couldn't see any reason for it, and it was
      surprising.
      
      ClientCache.invalidate():  Added some asserts to clarify intended
      preconditions.  Alas, my guess that it was intended that the passed-in
      tid always be greater than the current tid turned out to trigger
      errors.  This gets complicated, and hasn't been resolved yet.  The
      problem is that the passed-in tid can be (in fact, always is) None
      during cache verification.  The code here *really* doesn't seem to
      be expecting that, and the on-disk cache file is clearly left in a
      wrong state (if we repopulated the cache from the disk file, the
      object would not look invalidated any more, it would look current).
      Dumped in a giant stack trace so I don't forget this; sent email to
      Jeremy asking if he recalls what the real intent was.
      acf7ef56
    • Tim Peters's avatar
      More cleanup, and a new problem. Notable: · c8985356
      Tim Peters authored
      Object.serialize_header():  Stopped stuffing the version string into this
      notion of "a header".  Couldn't see any reason for it, and it was
      surprising.
      
      ClientCache.invalidate():  Added some asserts to clarify intended
      preconditions.  Alas, my guess that it was intended that the passed-in
      tid always be greater than the current tid turned out to trigger
      errors.  This gets complicated, and hasn't been resolved yet.  The
      problem is that the passed-in tid can be (in fact, always is) None
      during cache verification.  The code here *really* doesn't seem to
      be expecting that, and the on-disk cache file is clearly left in a
      wrong state (if we repopulated the cache from the disk file, the
      object would not look invalidated any more, it would look current).
      Dumped in a giant stack trace so I don't forget this; sent email to
      Jeremy asking if he recalls what the real intent was.
      c8985356
    • Tim Peters's avatar
      Merge rev 28673 from 3.3 branch. · 734d436a
      Tim Peters authored
      More cleanup.  Notable:
      
      - Object.fromFile():  renamed `header_only` arg to `skip_data`.
        Skipping the data is what it does, while there are at least 3
        distinct notions of what "a header" means in this module.
        Object has two notions of "header" all by itself (& I'm still
        not sure why Object.serialize_header() considers the version
        string to be part of "the header").
      
      - FileCache.__init__():  log a warning if reuse=True but the
        given file path doesn't exist.  The code ignores `reuse` then
        (before, and now).  Not sure that's the best thing to do.
      734d436a
    • Tim Peters's avatar
      More cleanup. Notable: · 372eb290
      Tim Peters authored
      - Object.fromFile():  renamed `header_only` arg to `skip_data`.
        Skipping the data is what it does, while there are at least 3
        distinct notions of what "a header" means in this module.
        Object has two notions of "header" all by itself (& I'm still
        not sure why Object.serialize_header() considers the version
        string to be part of "the header").
      
      - FileCache.__init__():  log a warning if reuse=True but the
        given file path doesn't exist.  The code ignores `reuse` then
        (before, and now).  Not sure that's the best thing to do.
      372eb290
    • Tim Peters's avatar
      Merged rev 28671 from 3.3 branch. · fa3bffcc
      Tim Peters authored
      More cleanup.  Notable:
      
      - Moved the logger object to module scope.  There's virtually
        no logging of any kind done here, and I suspect that's partly
        because the logging object was clumsy to get at.
      
      - Figured out what the code actually does when the cache size
        asked for doesn't match the actual size of a pre-existing
        cache file.  It apparently wanted to ignore the requested
        size then.  It probably shouldn't, but leaving that for later.
        Still, it left its own idea of the file size out of synch
        with the actual file size, and that was a bug.  For now,
        logged a warning when this happens, and changed the code to
        respect the actual file size.
      fa3bffcc
    • Tim Peters's avatar
      More cleanup. Notable: · af5142f2
      Tim Peters authored
      - Moved the logger object to module scope.  There's virtually
        no logging of any kind done here, and I suspect that's partly
        because the logging object was clumsy to get at.
      
      - Figured out what the code actually does when the cache size
        asked for doesn't match the actual size of a pre-existing
        cache file.  It apparently wanted to ignore the requested
        size then.  It probably shouldn't, but leaving that for later.
        Still, it left its own idea of the file size out of synch
        with the actual file size, and that was a bug.  For now,
        logged a warning when this happens, and changed the code to
        respect the actual file size.
      af5142f2
    • Tim Peters's avatar
      Merged rev 28664 from 3.3 branch. · d46d9854
      Tim Peters authored
      More cleanup.  Notable:
      
      ClientCache:  Removed the .tid attribute.  It was never updated; the
      contained FileCache instance actually keeps track of the last tid.
      This had the happy side effect of fixing bugs in testSerialization:
      it was accessing .tid directly, and so was _always_ comparing None to
      None.  Changing the test to use .getLastTid() instead means it's now
      testing what it always intended to test.
      
      FileCache:  Removed some unused private attributes for tracking
      internal statistics.
      d46d9854
    • Tim Peters's avatar
      More cleanup. Notable: · 49baf191
      Tim Peters authored
      ClientCache:  Removed the .tid attribute.  It was never updated; the
      contained FileCache instance actually keeps track of the last tid.
      This had the happy side effect of fixing bugs in testSerialization:
      it was accessing .tid directly, and so was _always_ comparing None to
      None.  Changing the test to use .getLastTid() instead means it's now
      testing what it always intended to test.
      
      FileCache:  Removed some unused private attributes for tracking
      internal statistics.
      49baf191
    • Tim Peters's avatar
      Merge rev 28660 from 3.3 branch. · 8c43d1f8
      Tim Peters authored
      More code and comment cleanups.  Notable changes:
      
      FileCache:  removed the currentsize attribute.  It was initialized
      to 0 but never updated.  Some tests referenced it, but since it was
      always 0 those tests weren't getting any good from it.  Don't
      recall (or never knew) what its intended purpose may have been.
      
      FileCache.remove():  Repaired major bug.  This mistakenly stored
      the "this disk block is free now" status byte into the start of
      the serialized Object record's end_tid field (incorrect seek
      offset).  The in-memory structures were correct then, but got out
      of synch with the disk file; the latter then still claimed to have
      info for a "live" object revision, but that revision was actually
      dead, and the info on disk had a corrupt end_tid value.
      8c43d1f8
    • Tim Peters's avatar
      More code and comment cleanups. Notable changes: · b266642f
      Tim Peters authored
      FileCache:  removed the currentsize attribute.  It was initialized
      to 0 but never updated.  Some tests referenced it, but since it was
      always 0 those tests weren't getting any good from it.  Don't
      recall (or never knew) what its intended purpose may have been.
      
      FileCache.remove():  Repaired major bug.  This mistakenly stored
      the "this disk block is free now" status byte into the start of
      the serialized Object record's end_tid field (incorrect seek
      offset).  The in-memory structures were correct then, but got out
      of synch with the disk file; the latter then still claimed to have
      info for a "live" object revision, but that revision was actually
      dead, and the info on disk had a corrupt end_tid value.
      b266642f
  6. 20 Dec, 2004 2 commits
  7. 10 Dec, 2004 2 commits
  8. 09 Dec, 2004 4 commits
  9. 16 Nov, 2004 2 commits
    • Tim Peters's avatar
      Merge rev 28466 from 3.3 branch. · a561cc4e
      Tim Peters authored
      Forward port from ZODB 3.2.
      
      Collector 1581:  fspack can blow up when .fs is corrupted
      
      Repaired three places where fspack referenced an undefined global while
      *trying* to raise CorruptedError.  Added new checkCorruptionInPack()
      test to verify the correct exception gets raised.
      
      a561cc4e
    • Tim Peters's avatar
      Forward port from ZODB 3.2. · 732638d1
      Tim Peters authored
      Collector 1581:  fspack can blow up when .fs is corrupted
      
      Repaired three places where fspack referenced an undefined global while
      *trying* to raise CorruptedError.  Added new checkCorruptionInPack()
      test to verify the correct exception gets raised.
      732638d1
  10. 11 Nov, 2004 10 commits