[CalendarServer-changes] [9290] CalendarServer/branches/users/glyph/uuid-normalize/txdav

source_changes at macosforge.org source_changes at macosforge.org
Thu May 24 13:34:21 PDT 2012


Revision: 9290
          http://trac.macosforge.org/projects/calendarserver/changeset/9290
Author:   glyph at apple.com
Date:     2012-05-24 13:34:21 -0700 (Thu, 24 May 2012)
Log Message:
-----------
Disable caching entirely during this transaction, since proper cache invalidation after 'update...OWNER_UID...' is almost impossible.

Modified Paths:
--------------
    CalendarServer/branches/users/glyph/uuid-normalize/txdav/caldav/datastore/sql.py
    CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py

Modified: CalendarServer/branches/users/glyph/uuid-normalize/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/glyph/uuid-normalize/txdav/caldav/datastore/sql.py	2012-05-24 20:34:18 UTC (rev 9289)
+++ CalendarServer/branches/users/glyph/uuid-normalize/txdav/caldav/datastore/sql.py	2012-05-24 20:34:21 UTC (rev 9290)
@@ -508,7 +508,7 @@
         ).on(self._txn)
         self._supportedComponents = supported_components
 
-        queryCacher = self._txn.store().queryCacher
+        queryCacher = self._txn._queryCacher
         if queryCacher is not None:
             cacheKey = queryCacher.keyForHomeChildMetaData(self._resourceID)
             yield queryCacher.invalidateAfterCommit(self._txn, cacheKey)

Modified: CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py	2012-05-24 20:34:18 UTC (rev 9289)
+++ CalendarServer/branches/users/glyph/uuid-normalize/txdav/common/datastore/sql.py	2012-05-24 20:34:21 UTC (rev 9290)
@@ -187,7 +187,7 @@
         return []
 
 
-    def newTransaction(self, label="unlabeled"):
+    def newTransaction(self, label="unlabeled", disableCache=False):
         """
         @see: L{IDataStore.newTransaction}
         """
@@ -199,12 +199,14 @@
             self.notifierFactory if self._enableNotifications else None,
             label,
             self._migrating,
+            disableCache
         )
-        
         if self.logTransactionWaits or self.timeoutTransactions:
-            CommonStoreTransactionMonitor(txn, self.logTransactionWaits, self.timeoutTransactions)
+            CommonStoreTransactionMonitor(txn, self.logTransactionWaits,
+                                          self.timeoutTransactions)
         return txn
 
+
     def setMigrating(self, state):
         """
         Set the "migrating" state
@@ -312,7 +314,7 @@
 
     def __init__(self, store, sqlTxn,
                  enableCalendars, enableAddressBooks,
-                 notifierFactory, label, migrating=False):
+                 notifierFactory, label, migrating=False, disableCache=False):
         self._store = store
         self._calendarHomes = {}
         self._addressbookHomes = {}
@@ -324,6 +326,11 @@
         self._label = label
         self._migrating = migrating
         self._primaryHomeType = None
+        self._disableCache = disableCache
+        if disableCache:
+            self._queryCacher = None
+        else:
+            self._queryCacher = store.queryCacher
 
         CommonStoreTransaction.id += 1
         self._txid = CommonStoreTransaction.id
@@ -846,6 +853,15 @@
         returnValue(count)
 
 
+class _EmptyCacher(object):
+    def set(self, key, value):
+        return succeed(True)
+    def get(self, key, withIdentifier=False):
+        return succeed(None)
+    def delete(self, key):
+        return succeed(True)
+
+
 class CommonHome(LoggingMixIn):
 
     # All these need to be initialized by derived classes for each store type
@@ -877,6 +893,8 @@
         self._created = None
         self._modified = None
         self._syncTokenRevision = None
+        if transaction._disableCache:
+            self._cacher = _EmptyCacher()
 
         # Needed for REVISION/BIND table join
         self._revisionBindJoinTable = {}
@@ -937,7 +955,7 @@
         if result:
             self._resourceID = result[0][0]
 
-            queryCacher = self._txn.store().queryCacher
+            queryCacher = self._txn._queryCacher
             if queryCacher:
                 # Get cached copy
                 cacheKey = queryCacher.keyForHomeMetaData(self._resourceID)
@@ -1519,7 +1537,7 @@
             
         try:
             self._modified = (yield self._txn.subtransaction(_bumpModified, retries=0, failureOK=True))[0][0]
-            queryCacher = self._txn.store().queryCacher
+            queryCacher = self._txn._queryCacher
             if queryCacher is not None:
                 cacheKey = queryCacher.keyForHomeMetaData(self._resourceID)
                 yield queryCacher.invalidateAfterCommit(self._txn, cacheKey)
@@ -2285,7 +2303,7 @@
             exists.
         """
         data = None
-        queryCacher = home._txn.store().queryCacher
+        queryCacher = home._txn._queryCacher
         # Only caching non-shared objects so that we don't need to invalidate
         # in sql_legacy
         if owned and queryCacher:
@@ -2447,7 +2465,7 @@
         resource ID. We read in and cache all the extra metadata from the DB to
         avoid having to do DB queries for those individually later.
         """
-        queryCacher = self._txn.store().queryCacher
+        queryCacher = self._txn._queryCacher
         if queryCacher:
             # Retrieve from cache
             cacheKey = queryCacher.keyForHomeChildMetaData(self._resourceID)
@@ -2521,7 +2539,7 @@
         """
         oldName = self._name
 
-        queryCacher = self._home._txn.store().queryCacher
+        queryCacher = self._home._txn._queryCacher
         if queryCacher:
             cacheKey = queryCacher.keyForObjectWithName(self._home._resourceID, oldName)
             yield queryCacher.invalidateAfterCommit(self._home._txn, cacheKey)
@@ -2554,7 +2572,7 @@
     @inlineCallbacks
     def remove(self):
 
-        queryCacher = self._home._txn.store().queryCacher
+        queryCacher = self._home._txn._queryCacher
         if queryCacher:
             cacheKey = queryCacher.keyForObjectWithName(self._home._resourceID, self._name)
             yield queryCacher.invalidateAfterCommit(self._home._txn, cacheKey)
@@ -2981,7 +2999,7 @@
         try:
             self._modified = (yield self._txn.subtransaction(_bumpModified, retries=0, failureOK=True))[0][0]
 
-            queryCacher = self._txn.store().queryCacher
+            queryCacher = self._txn._queryCacher
             if queryCacher is not None:
                 cacheKey = queryCacher.keyForHomeChildMetaData(self._resourceID)
                 yield queryCacher.invalidateAfterCommit(self._txn, cacheKey)
@@ -4191,7 +4209,7 @@
     """
     Fix all case normalization for a given store.
     """
-    t = store.newTransaction()
+    t = store.newTransaction(disableCache=True)
     try:
         yield _normalizeHomeUUIDsIn(t, ECALENDARTYPE)
         yield _normalizeHomeUUIDsIn(t, EADDRESSBOOKTYPE)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120524/d2a3ace7/attachment-0001.html>


More information about the calendarserver-changes mailing list