Andrew Bogott has submitted this change and it was merged.

Change subject: openstack: cache mwclient connection in wikistatus
......................................................................


openstack: cache mwclient connection in wikistatus

Cache the mwclient.Site object in a thread local variable to reduce the
number of authentication attempts that are made to wikitech. Creating
a new mwclient connection for each call to WikiStatus.notify leads to
exceeding the login rate throttle. A cached client will be discarded
when an authn/authz related exception is encountered.

Co-Authored-By: Andrew Bogott <abog...@wikimedia.org>

Change-Id: Iec97ae65cdaee23fd6e5275366fc65b3558a8e80
---
M modules/openstack/files/liberty/nova/wikistatus/wikistatus.py
1 file changed, 30 insertions(+), 8 deletions(-)

Approvals:
  Andrew Bogott: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/modules/openstack/files/liberty/nova/wikistatus/wikistatus.py 
b/modules/openstack/files/liberty/nova/wikistatus/wikistatus.py
index 152b272..984529a 100644
--- a/modules/openstack/files/liberty/nova/wikistatus/wikistatus.py
+++ b/modules/openstack/files/liberty/nova/wikistatus/wikistatus.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import threading
 import time
 
 import mwclient
@@ -100,6 +101,7 @@
     def __init__(self, conf, topics, transport, version=1.0):
         self.host = CONF.wiki_host
         self._image_service = image.glance.get_default_image_service()
+        self._thread_local = threading.local()
 
     @staticmethod
     def _wiki_login(host):
@@ -115,7 +117,7 @@
                     return site
                 except mwclient.APIError:
                     LOG.exception(
-                        "mwclient login failed, will try %d more times" % 
count)
+                        "mwclient login failed, %d more tries" % count)
                     time.sleep(2)
             raise mwclient.MaximumRetriesExceeded()
         else:
@@ -124,11 +126,19 @@
                         % host)
             return None
 
+    def _get_site(self):
+        site = getattr(self._thread_local, 'site', None)
+        if site is None:
+            site = self._wiki_login(self.host)
+            self._thread_local.site = site
+        return site
+
     def _deserialize_context(self, contextdict):
         context = nova.context.RequestContext(**contextdict)
         return context
 
-    def notify(self, context, message, priority, retry=False):
+    def notify(self, context, message, priority,
+               retry=False):
         ctxt = self._deserialize_context(context)
 
         event_type = message.get('event_type')
@@ -156,10 +166,10 @@
         if CONF.wiki_instance_dns_domain:
             fqdn = "%s.%s.%s" % (instance_name, inst['project_id'],
                                  CONF.wiki_instance_dns_domain)
-            resourceName = fqdn
+            resource_name = fqdn
         else:
             fqdn = instance_name
-            resourceName = ec2_id
+            resource_name = ec2_id
 
         template_param_dict['cpu_count'] = inst['vcpus']
         template_param_dict['disk_gb_current'] = inst['ephemeral_gb']
@@ -215,13 +225,18 @@
                                                             fields_string,
                                                             end_comment)
 
-        site = self._wiki_login(self.host)
-        pagename = "%s%s" % (CONF.wiki_page_prefix, resourceName)
+        self.edit_page(page_string, resource_name, delete_page)
+
+    def edit_page(self, page_string, resource_name, delete_page,
+                  second_try=False):
+        site = self._get_site()
+        pagename = "%s%s" % (CONF.wiki_page_prefix, resource_name)
         LOG.debug("wikistatus:  Writing instance info"
                   " to page http://%s/wiki/%s"; %
                   (self.host, pagename))
 
         page = site.Pages[pagename]
+        failed = False
         try:
             if delete_page:
                 page.delete(reason='Instance deleted')
@@ -246,5 +261,12 @@
                 page.save(newText, "Auto update of instance info.")
         except (mwclient.errors.InsufficientPermission,
                 mwclient.errors.LoginError):
-            LOG.debug("Failed to update wiki page..."
-                      " trying to re-login next time.")
+            LOG.exception(
+                "Failed to update wiki page..."
+                " trying to re-login next time.")
+            self._thread_local.site = None
+            failed = True
+
+        if failed and not second_try:
+            self.edit_page(page_string, resource_name, delete_page,
+                           second_try=True)

-- 
To view, visit https://gerrit.wikimedia.org/r/321169
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Iec97ae65cdaee23fd6e5275366fc65b3558a8e80
Gerrit-PatchSet: 7
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: BryanDavis <bda...@wikimedia.org>
Gerrit-Reviewer: Alex Monk <a...@wikimedia.org>
Gerrit-Reviewer: Andrew Bogott <abog...@wikimedia.org>
Gerrit-Reviewer: BryanDavis <bda...@wikimedia.org>
Gerrit-Reviewer: Volans <rcocci...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to