Commit c7967efe authored by Jim Fulton's avatar Jim Fulton

Added assertion data.

parent 5f7145c7
...@@ -233,6 +233,9 @@ class ClientCache(object): ...@@ -233,6 +233,9 @@ class ClientCache(object):
# file, and tell our parent about it too (via the `install` callback). # file, and tell our parent about it too (via the `install` callback).
# Remember the location of the largest free block. That seems a # Remember the location of the largest free block. That seems a
# decent place to start currentofs. # decent place to start currentofs.
self.current = ZODB.fsIndex.fsIndex()
self.noncurrent = BTrees.LOBTree.LOBTree()
max_free_size = l = 0 max_free_size = l = 0
ofs = max_free_offset = ZEC3_HEADER_SIZE ofs = max_free_offset = ZEC3_HEADER_SIZE
current = self.current current = self.current
...@@ -243,9 +246,10 @@ class ClientCache(object): ...@@ -243,9 +246,10 @@ class ClientCache(object):
size, oid, start_tid, end_tid = unpack(">I8s8s8s", read(28)) size, oid, start_tid, end_tid = unpack(">I8s8s8s", read(28))
if end_tid == z64: if end_tid == z64:
assert oid not in current, (ofs, self.f.tell())
current[oid] = ofs current[oid] = ofs
else: else:
assert start_tid < end_tid assert start_tid < end_tid, (ofs, self.f.tell())
self._set_noncurrent(oid, start_tid, ofs) self._set_noncurrent(oid, start_tid, ofs)
l += 1 l += 1
elif status == 'f': elif status == 'f':
...@@ -296,12 +300,12 @@ class ClientCache(object): ...@@ -296,12 +300,12 @@ class ClientCache(object):
# Close the underlying file. No methods accessing the cache should be # Close the underlying file. No methods accessing the cache should be
# used after this. # used after this.
def close(self): def close(self):
if hasattr(self,'_lock_file'):
self._lock_file.close()
if self.f: if self.f:
sync(self.f) sync(self.f)
self.f.close() self.f.close()
self.f = None self.f = None
if hasattr(self,'_lock_file'):
self._lock_file.close()
## ##
# Evict objects as necessary to free up at least nbytes bytes, # Evict objects as necessary to free up at least nbytes bytes,
...@@ -315,7 +319,8 @@ class ClientCache(object): ...@@ -315,7 +319,8 @@ class ClientCache(object):
# freed (starting at currentofs when _makeroom returns, and # freed (starting at currentofs when _makeroom returns, and
# spanning the number of bytes retured by _makeroom). # spanning the number of bytes retured by _makeroom).
def _makeroom(self, nbytes): def _makeroom(self, nbytes):
assert 0 < nbytes <= self.maxsize - ZEC3_HEADER_SIZE assert 0 < nbytes <= self.maxsize - ZEC3_HEADER_SIZE, (
nbytes, self.maxsize)
if self.currentofs + nbytes > self.maxsize: if self.currentofs + nbytes > self.maxsize:
self.currentofs = ZEC3_HEADER_SIZE self.currentofs = ZEC3_HEADER_SIZE
ofs = self.currentofs ofs = self.currentofs
...@@ -353,7 +358,7 @@ class ClientCache(object): ...@@ -353,7 +358,7 @@ class ClientCache(object):
raise ValueError("new last tid (%s) must be greater than " raise ValueError("new last tid (%s) must be greater than "
"previous one (%s)" % (u64(tid), "previous one (%s)" % (u64(tid),
u64(self.tid))) u64(self.tid)))
assert isinstance(tid, str) and len(tid) == 8 assert isinstance(tid, str) and len(tid) == 8, tid
self.tid = tid self.tid = tid
self.f.seek(len(magic)) self.f.seek(len(magic))
self.f.write(tid) self.f.write(tid)
...@@ -384,10 +389,10 @@ class ClientCache(object): ...@@ -384,10 +389,10 @@ class ClientCache(object):
return None return None
self.f.seek(ofs) self.f.seek(ofs)
read = self.f.read read = self.f.read
assert read(1) == 'a' assert read(1) == 'a', (ofs, self.f.tell(), oid)
size, saved_oid, tid, end_tid, lver, ldata = unpack( size, saved_oid, tid, end_tid, lver, ldata = unpack(
">I8s8s8shI", read(34)) ">I8s8s8shI", read(34))
assert saved_oid == oid assert saved_oid == oid, (ofs, self.f.tell(), oid, saved_oid)
if lver or version: if lver or version:
if lver != len(version) or read(lver) != version: if lver != len(version) or read(lver) != version:
self._trace(0x20, oid, version) self._trace(0x20, oid, version)
...@@ -395,8 +400,8 @@ class ClientCache(object): ...@@ -395,8 +400,8 @@ class ClientCache(object):
data = read(ldata) data = read(ldata)
assert len(data) == ldata assert len(data) == ldata, (ofs, self.f.tell(), oid, len(data), ldata)
assert read(8) == oid assert read(8) == oid, (ofs, self.f.tell(), oid)
self._n_accesses += 1 self._n_accesses += 1
self._trace(0x22, oid, version, tid, end_tid, ldata) self._trace(0x22, oid, version, tid, end_tid, ldata)
...@@ -423,16 +428,16 @@ class ClientCache(object): ...@@ -423,16 +428,16 @@ class ClientCache(object):
self.f.seek(ofs) self.f.seek(ofs)
read = self.f.read read = self.f.read
assert read(1) == 'a' assert read(1) == 'a', (ofs, self.f.tell(), oid, before_tid)
size, saved_oid, saved_tid, end_tid, lver, ldata = unpack( size, saved_oid, saved_tid, end_tid, lver, ldata = unpack(
">I8s8s8shI", read(34)) ">I8s8s8shI", read(34))
assert saved_oid == oid assert saved_oid == oid, (ofs, self.f.tell(), oid, saved_oid)
assert saved_tid == p64(tid) assert saved_tid == p64(tid), (ofs, self.f.tell(), oid, saved_tid, tid)
assert lver == 0 assert lver == 0, (ofs, self.f.tell())
assert end_tid != z64 assert end_tid != z64, (ofs, self.f.tell(), oid)
data = read(ldata) data = read(ldata)
assert len(data) == ldata assert len(data) == ldata, (ofs, self.f.tell())
assert read(8) == oid assert read(8) == oid, (ofs, self.f.tell(), oid)
if end_tid < before_tid: if end_tid < before_tid:
self._trace(0x24, oid, "", before_tid) self._trace(0x24, oid, "", before_tid)
...@@ -456,10 +461,10 @@ class ClientCache(object): ...@@ -456,10 +461,10 @@ class ClientCache(object):
return None return None
self.f.seek(ofs) self.f.seek(ofs)
read = self.f.read read = self.f.read
assert self.f.read(1) == 'a' assert self.f.read(1) == 'a', (ofs, self.f.tell(), oid)
size, saved_oid, saved_tid, end_tid, lver, ldata = unpack( size, saved_oid, saved_tid, end_tid, lver, ldata = unpack(
">I8s8s8shI", read(34)) ">I8s8s8shI", read(34))
assert saved_oid == oid assert saved_oid == oid, (ofs, self.f.tell(), oid, saved_oid)
if lver: if lver:
return read(lver) return read(lver)
return None return None
...@@ -490,11 +495,11 @@ class ClientCache(object): ...@@ -490,11 +495,11 @@ class ClientCache(object):
if ofs: if ofs:
seek(ofs) seek(ofs)
read = self.f.read read = self.f.read
assert read(1) == 'a' assert read(1) == 'a', (ofs, self.f.tell(), oid)
size, saved_oid, saved_tid, end_tid = unpack( size, saved_oid, saved_tid, end_tid = unpack(
">I8s8s8s", read(28)) ">I8s8s8s", read(28))
assert saved_oid == oid assert saved_oid == oid, (ofs, self.f.tell(), oid, saved_oid)
assert end_tid == z64 assert end_tid == z64, (ofs, self.f.tell(), oid)
if saved_tid == start_tid: if saved_tid == start_tid:
return return
raise ValueError("already have current data for oid") raise ValueError("already have current data for oid")
...@@ -520,7 +525,7 @@ class ClientCache(object): ...@@ -520,7 +525,7 @@ class ClientCache(object):
self._len += 1 self._len += 1
nfreebytes = self._makeroom(size) nfreebytes = self._makeroom(size)
assert size <= nfreebytes assert size <= nfreebytes, (size, nfreebytes)
excess = nfreebytes - size excess = nfreebytes - size
# If there's any excess (which is likely), we need to record a # If there's any excess (which is likely), we need to record a
# free block following the end of the data record. That isn't # free block following the end of the data record. That isn't
...@@ -593,11 +598,11 @@ class ClientCache(object): ...@@ -593,11 +598,11 @@ class ClientCache(object):
self.f.seek(ofs) self.f.seek(ofs)
read = self.f.read read = self.f.read
assert read(1) == 'a' assert read(1) == 'a', (ofs, self.f.tell(), oid)
size, saved_oid, saved_tid, end_tid, lver = unpack( size, saved_oid, saved_tid, end_tid, lver = unpack(
">I8s8s8sh", read(30)) ">I8s8s8sh", read(30))
assert saved_oid == oid assert saved_oid == oid, (ofs, self.f.tell(), oid, saved_oid)
assert end_tid == z64 assert end_tid == z64, (ofs, self.f.tell(), oid)
del self.current[oid] del self.current[oid]
if tid is None or lver: if tid is None or lver:
self.f.seek(ofs) self.f.seek(ofs)
...@@ -626,10 +631,10 @@ class ClientCache(object): ...@@ -626,10 +631,10 @@ class ClientCache(object):
read = self.f.read read = self.f.read
for oid, ofs in self.current.iteritems(): for oid, ofs in self.current.iteritems():
seek(ofs) seek(ofs)
assert read(1) == 'a' assert read(1) == 'a', (ofs, self.f.tell(), oid)
size, saved_oid, tid, end_tid, lver = unpack(">I8s8s8sh", read(30)) size, saved_oid, tid, end_tid, lver = unpack(">I8s8s8sh", read(30))
assert saved_oid == oid assert saved_oid == oid, (ofs, self.f.tell(), oid, saved_oid)
assert end_tid == z64 assert end_tid == z64, (ofs, self.f.tell(), oid)
if lver: if lver:
version = read(lver) version = read(lver)
else: else:
...@@ -697,7 +702,6 @@ class ClientCache(object): ...@@ -697,7 +702,6 @@ class ClientCache(object):
self._trace = _trace self._trace = _trace
_trace(0x00) _trace(0x00)
def sync(f): def sync(f):
f.flush() f.flush()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment