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