[CalendarServer-changes] [13835] twext/trunk/twext/who/opendirectory/_service.py

source_changes at macosforge.org source_changes at macosforge.org
Mon Aug 4 17:17:30 PDT 2014


Revision: 13835
          http://trac.calendarserver.org//changeset/13835
Author:   sagen at apple.com
Date:     2014-08-04 17:17:30 -0700 (Mon, 04 Aug 2014)
Log Message:
-----------
deferToThread for OD queries

Modified Paths:
--------------
    twext/trunk/twext/who/opendirectory/_service.py

Modified: twext/trunk/twext/who/opendirectory/_service.py
===================================================================
--- twext/trunk/twext/who/opendirectory/_service.py	2014-08-05 00:15:20 UTC (rev 13834)
+++ twext/trunk/twext/who/opendirectory/_service.py	2014-08-05 00:17:30 UTC (rev 13835)
@@ -25,6 +25,7 @@
 from zope.interface import implementer
 
 from twisted.internet.defer import succeed, fail, inlineCallbacks, returnValue
+from twisted.internet.threads import deferToThread
 from twisted.web.guard import DigestCredentialFactory
 
 from twext.python.log import Logger
@@ -52,6 +53,7 @@
     ODSearchPath, ODRecordType, ODAttribute, ODMatchType, ODAuthMethod,
 )
 
+DEFER_TO_THREAD = True
 
 
 #
@@ -641,6 +643,7 @@
         return False
 
 
+    @inlineCallbacks
     def _recordsFromQuery(self, query):
         """
         Executes a query and generates directory records from it.
@@ -652,23 +655,35 @@
         @rtype: list of L{DirectoryRecord}
         """
 
-        # FIXME: This is blocking.
         # We can call scheduleInRunLoop:forMode:, which will call back to
         # its delegate...
 
         if query is None:
-            return succeed([])
+            returnValue(None)
 
-        odRecords, error = query.resultsAllowingPartial_error_(False, None)
+        if DEFER_TO_THREAD:
+            odRecords, error = (
+                yield deferToThread(
+                    query.resultsAllowingPartial_error_,
+                    False,
+                    None
+                )
+            )
+        else:
+            odRecords, error = query.resultsAllowingPartial_error_(False, None)
 
         if error:
             self.log.error(
                 "Error while executing OpenDirectory query: {error}",
                 error=error
             )
-            return fail(OpenDirectoryQueryError(
-                "Unable to execute OpenDirectory query", error
-            ))
+            returnValue(
+                fail(
+                    OpenDirectoryQueryError(
+                        "Unable to execute OpenDirectory query", error
+                    )
+                )
+            )
 
         result = []
         for odRecord in odRecords:
@@ -689,7 +704,7 @@
 
             result.append(record)
 
-        return succeed(result)
+        returnValue(result)
 
 
     def recordsFromNonCompoundExpression(self, expression, recordTypes=None, records=None):
@@ -974,15 +989,27 @@
     # Verifiers for twext.who.checker stuff.
     #
 
+    @inlineCallbacks
     def verifyPlaintextPassword(self, password):
-        result, error = self._odRecord.verifyPassword_error_(password, None)
 
+        if DEFER_TO_THREAD:
+            result, error = (
+                yield deferToThread(
+                    self._odRecord.verifyPassword_error_,
+                    password,
+                    None
+                )
+            )
+        else:
+            result, error = self._odRecord.verifyPassword_error_(password, None)
+
         if error:
-            return succeed(False)
+            returnValue(False)
 
-        return succeed(result)
+        returnValue(result)
 
 
+    @inlineCallbacks
     def verifyHTTPDigest(
         self, username, realm, uri, nonce, cnonce,
         algorithm, nc, qop, response, method,
@@ -1016,16 +1043,26 @@
             response=response
         )
 
-        result, _ignore_m1, _ignore_m2, error = self._odRecord.verifyExtendedWithAuthenticationType_authenticationItems_continueItems_context_error_(
-            ODAuthMethod.digestMD5.value,
-            [username, challenge, responseArg, method],
-            None, None, None
-        )
+        if DEFER_TO_THREAD:
+            result, _ignore_m1, _ignore_m2, error = (
+                yield deferToThread(
+                    self._odRecord.verifyExtendedWithAuthenticationType_authenticationItems_continueItems_context_error_,
+                    ODAuthMethod.digestMD5.value,
+                    [username, challenge, responseArg, method],
+                    None, None, None
+                )
+            )
+        else:
+            result, _ignore_m1, _ignore_m2, error = self._odRecord.verifyExtendedWithAuthenticationType_authenticationItems_continueItems_context_error_(
+                ODAuthMethod.digestMD5.value,
+                [username, challenge, responseArg, method],
+                None, None, None
+            )
 
         if error:
-            return succeed(False)
+            returnValue(False)
 
-        return succeed(result)
+        returnValue(result)
 
 
     @inlineCallbacks
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140804/dc398e7b/attachment-0001.html>


More information about the calendarserver-changes mailing list