While hacking at Durus I accumulated a few fixes that shouldn't be too controversial: * fix typo in Connection.get_stored_pickle docstring * fix copy & paste error in utils.u32 docstring * eliminate hard-coded enum value in Cache.get_instance There was another change I wanted to make, which was to derive a specific WriteConflictError from ConflictError, and fix the ConflictError docstring to not describe a write conflict. Applications may want to distinguish between write and read conflicts, for example to retry a different number of times for each. However, a few points where conflict errors are currently raised threw me off. Perhaps these two cases should just be an assert rather than raising an (already raised) conflict, since they indicated a programming error: == Connection.get_stored_pickle() == if oid in self.invalid_oids: # someone is still trying to read after getting a conflict raise ReadConflictError([oid]) == Connection.commit() == if self.invalid_oids: # someone is trying to commit after a read or write conflict raise ConflictError(list(self.invalid_oids)) --John
diff -urN Durus-3.5.orig/connection.py Durus-3.5/connection.py --- Durus-3.5.orig/connection.py 2006-08-01 16:21:11.000000000 -0400 +++ Durus-3.5/connection.py 2006-10-01 22:09:16.000000000 -0400 @@ -5,7 +5,7 @@ from heapq import heappush, heappop from durus.error import ConflictError, ReadConflictError, DurusKeyError from durus.logger import log -from durus.persistent import ConnectionBase +from durus.persistent import ConnectionBase, GHOST from durus.persistent_dict import PersistentDict from durus.serialize import ObjectReader, ObjectWriter from durus.serialize import split_oids, unpack_record, pack_record @@ -96,7 +96,7 @@ def get_stored_pickle(self, oid): """(oid:str) -> str Retrieve the pickle from storage. Will raise ReadConflictError if - pickle the pickle is invalid. + the pickle is invalid. """ if oid in self.invalid_oids: # someone is still trying to read after getting a conflict @@ -346,7 +346,7 @@ obj = klass.__new__(klass) obj._p_oid = oid obj._p_connection = connection - obj._p_status = -1 # obj._p_set_status_ghost() + obj._p_status = GHOST # obj._p_set_status_ghost() objects[oid] = obj return obj diff -urN Durus-3.5.orig/utils.py Durus-3.5/utils.py --- Durus-3.5.orig/utils.py 2006-05-11 08:45:36.000000000 -0400 +++ Durus-3.5/utils.py 2006-10-01 21:45:55.000000000 -0400 @@ -23,6 +23,6 @@ return struct.pack(">L", v) def u32(v): - """Unpack an 8-byte string into a 32-bit long integer.""" + """Unpack an 4-byte string into a 32-bit long integer.""" return struct.unpack(">L", v)[0]