This is an automated email from the ASF dual-hosted git repository.

houshengbo pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-openwhisk-package-kafka.git


The following commit(s) were added to refs/heads/master by this push:
     new 028088c  Use one canary document per provider instance (#197)
028088c is described below

commit 028088cda88320acd0665c09cc3bb171f4bc82c7
Author: Justin Berstler <[email protected]>
AuthorDate: Tue Jul 11 15:05:23 2017 -0400

    Use one canary document per provider instance (#197)
    
    * Use one canary document per provider instance
    
    This eliminates canary document deletes, which is good news for the changes 
feed as it won't have to process all the deletes when the container starts. 
This also avoids the problem of getting a 404 while trying to delete a canary 
that was already deleted by another instance.
    
    * respond to review feedback
---
 provider/database.py | 42 ++++++++++++++++++++++++------------------
 provider/service.py  |  5 +----
 2 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/provider/database.py b/provider/database.py
index 0d2e3b6..4d0f78a 100644
--- a/provider/database.py
+++ b/provider/database.py
@@ -41,6 +41,9 @@ class Database:
     filters_design_doc_id = '_design/filters'
     only_triggers_view_id = 'only-triggers'
 
+    instance = os.getenv('INSTANCE', 'messageHubTrigger-0')
+    canaryId = "canary-{}".format(instance)
+
     if dbname in client.all_dbs():
         logging.info('Database exists - connecting to it.')
         database = client[dbname]
@@ -85,31 +88,34 @@ class Database:
 
         while retryCount < maxRetries:
             try:
-                document = dict()
-                document['canary'] = datetime.now().isoformat()
+                if self.canaryId in self.database.keys(remote=True):
+                    # update the timestamp to cause a document change
+                    logging.debug("[database] Canary doc exists, updating it.")
+
+                    myCanaryDocument = self.database[self.canaryId]
+                    myCanaryDocument["canary-timestamp"] = 
datetime.now().isoformat()
+                    myCanaryDocument.save()
+
+                    return
+                else:
+                    # create the canary doc for this instance
+                    logging.debug("[database] Canary doc does not exist, 
creating it.")
 
-                result = self.database.create_document(document)
-                logging.info('[canary] Successfully wrote canary to DB')
+                    document = dict()
+                    document['_id'] = self.canaryId
+                    document['canary-timestamp'] = datetime.now().isoformat()
 
-                return result
+                    result = self.database.create_document(document)
+                    logging.debug('[canary] Successfully wrote canary to DB')
+
+                    return
             except Exception as e:
                 retryCount += 1
-                logging.error('[canary] Uncaught exception while recording 
trigger to database: {}'.format(e))
+                logging.error(
+                    '[canary] Uncaught exception while writing canary 
document: {}'.format(e))
 
         logging.error('[canary] Retried and failed {} times to create a 
canary'.format(maxRetries))
 
-    def deleteDoc(self, docId):
-        try:
-            document = self.database[docId]
-
-            if document.exists():
-                document.delete()
-                logging.debug('[database] Successfully deleted document from 
DB: {}'.format(docId))
-            else:
-                logging.warn('[database] Attempted to delete non-existent 
document from DB: {}'.format(docId))
-        except Exception as e:
-            logging.error('[database] Uncaught exception while deleting 
document {} from database: {}'.format(docId, e))
-
     def migrate(self):
         logging.info('Starting DB migration')
 
diff --git a/provider/service.py b/provider/service.py
index e12dbb6..7183b7f 100644
--- a/provider/service.py
+++ b/provider/service.py
@@ -104,13 +104,10 @@ class Service (Thread):
                                 existingConsumer.disable()
                             else:
                                 logging.debug('[changes] Found non-interesting 
trigger change: \n{}\n{}'.format(existingConsumer.desiredState(), document))
-                    elif 'canary' in change['doc']:
+                    elif 'canary-timestamp' in change['doc']:
                         # found a canary - update lastCanaryTime
                         logging.info('[canary] I found a canary. The last one 
was {} seconds ago.'.format(secondsSince(self.lastCanaryTime)))
                         self.lastCanaryTime = datetime.now()
-
-                        # delete the canary document
-                        self.database.deleteDoc(change['id'])
                     else:
                         logging.debug('[changes] Found a change for a 
non-trigger document')
 

-- 
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].

Reply via email to