diff --git a/product/ZSQLCatalog/SQLCatalog.py b/product/ZSQLCatalog/SQLCatalog.py index ca70f728bebf1f166c026598c4af92b690eff227..d7c78eba8f56450aa47c2ec283289dbc4acc821d 100644 --- a/product/ZSQLCatalog/SQLCatalog.py +++ b/product/ZSQLCatalog/SQLCatalog.py @@ -155,9 +155,13 @@ manage_addSQLCatalogForm = DTMLFile('dtml/addSQLCatalog',globals()) # global_uid_buffer_dict[catalog_path][thread_id] = UidBuffer global_uid_buffer_dict = {} +# These are global variables on memory, so shared only by threads in the same Zope instance. # This is used for exclusive access to the list of reserved uids. global_reserved_uid_lock = allocate_lock() +# This is set to the time when reserved uids are cleared in this Zope instance. +global_clear_reserved_time = None + def manage_addSQLCatalog(self, id, title, vocab_id='create_default_catalog_', # vocab_id is a strange name - not abbreviation REQUEST=None): @@ -636,10 +640,6 @@ class Catalog(Folder, # in BTrees.Length, this does not generate conflict errors. _max_uid = None - # These are class variable on memory, so shared only by threads in the same Zope instance. - # This is set to the time when reserved uids are cleared in this Zope instance. - _local_clear_reserved_time = None - # This is an instance id which specifies who owns which reserved uids. _instance_id = getattr(getConfiguration(), 'instance_id', None) @@ -1205,7 +1205,6 @@ class Catalog(Folder, security.declarePrivate('getUIDBuffer') def getUIDBuffer(self, force_new_buffer=False): - klass = self.__class__ assert global_reserved_uid_lock.locked() assert getattr(self, 'aq_base', None) is not None instance_key = self.getPhysicalPath() @@ -1226,13 +1225,13 @@ class Catalog(Folder, """ Produces reserved uids in advance """ - klass = self.__class__ + global global_clear_reserved_time assert global_reserved_uid_lock.locked() # This checks if the list of local reserved uids was cleared after clearReserved # had been called. - force_new_buffer = (klass._local_clear_reserved_time != self._last_clear_reserved_time) + force_new_buffer = (global_clear_reserved_time != self._last_clear_reserved_time) uid_buffer = self.getUIDBuffer(force_new_buffer=force_new_buffer) - klass._local_clear_reserved_time = self._last_clear_reserved_time + global_clear_reserved_time = self._last_clear_reserved_time if len(uid_buffer) == 0: id_tool = getattr(self.getPortalObject(), 'portal_ids', None) if id_tool is not None: @@ -1318,7 +1317,6 @@ class Catalog(Folder, if not self.getPortalObject().isIndexable(): return None - klass = self.__class__ with global_reserved_uid_lock: self.produceUid() uid_buffer = self.getUIDBuffer()