From 9c425d6a47f12d1424e213dd38398954c12b6162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Wed, 13 Jun 2018 14:06:00 +0200 Subject: [PATCH] Parse the WMS capabilities less times. One time per process and OGC server, Not one time per layers. And use broadcast to do it on all gunicorn process/host --- commons/c2cgeoportal_commons/models/main.py | 2 ++ .../scaffolds/update/CONST_vars.yaml_tmpl | 2 ++ .../c2cgeoportal_geoportal/views/entry.py | 20 ++++++++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/commons/c2cgeoportal_commons/models/main.py b/commons/c2cgeoportal_commons/models/main.py index 59c18984ccd..1d38d3e4bb7 100644 --- a/commons/c2cgeoportal_commons/models/main.py +++ b/commons/c2cgeoportal_commons/models/main.py @@ -46,6 +46,7 @@ import colander from deform.widget import HiddenWidget, SelectWidget, TextAreaWidget from c2cgeoform.ext import colander_ext, deform_ext +import c2cwsgiutils.broadcast from c2cgeoportal_commons.config import config from c2cgeoportal_commons.models import Base, _ @@ -62,6 +63,7 @@ class InvalidateCacheEvent: pass +@c2cwsgiutils.broadcast.decorator() def cache_invalidate_cb(*args: List[Any]) -> None: zope.event.notify(InvalidateCacheEvent()) diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_vars.yaml_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_vars.yaml_tmpl index 87fc204f5a9..302bea87e5f 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_vars.yaml_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_vars.yaml_tmpl @@ -64,6 +64,8 @@ vars: PRINT_URL: http://print:8080/print/ REDIS_HOST: redis REDIS_PORT: 6379 + C2C_REDIS_URL: redis://redis:6379 + C2C_BROADCAST_PREFIX: c2cgeoportal_ tilecloudchain: environment: VISIBLE_ENTRY_POINT: '{docker_entry_point}' diff --git a/geoportal/c2cgeoportal_geoportal/views/entry.py b/geoportal/c2cgeoportal_geoportal/views/entry.py index df3f457bb3c..c921c60305c 100644 --- a/geoportal/c2cgeoportal_geoportal/views/entry.py +++ b/geoportal/c2cgeoportal_geoportal/views/entry.py @@ -49,6 +49,7 @@ from sqlalchemy.orm import subqueryload from sqlalchemy.orm.exc import NoResultFound from owslib.wms import WebMapService +import zope.event.classhandler from c2cgeoportal_commons import models from c2cgeoportal_commons.models import main, static @@ -115,6 +116,7 @@ class Entry: WFS_NS = "http://www.opengis.net/wfs" default_ogc_server = None external_ogc_server = None + server_wms_capabilities = {} def __init__(self, request): self.request = request @@ -160,6 +162,14 @@ def __init__(self, request): ", ".join([i[0] for i in models.DBSession.query(main.OGCServer.name).all()]) ) + from c2cgeoportal_commons.models.main import InvalidateCacheEvent + + @zope.event.classhandler.handler(InvalidateCacheEvent) + def handle(event: InvalidateCacheEvent): + del event + Entry.server_wms_capabilities = {} + + @view_config(route_name="testi18n", renderer="testi18n.html") def testi18n(self): # pragma: no cover _ = self.request.translate @@ -200,6 +210,9 @@ def _get_metadatas(self, item, errors): def _wms_getcap(self, ogc_server=None): ogc_server = (ogc_server or self.default_ogc_server) + if ogc_server.id in self.server_wms_capabilities: + return self.server_wms_capabilities[ogc_server.id] + url, content, errors = self._wms_getcap_cached( ogc_server, self._get_capabilities_cache_role_key(ogc_server) ) @@ -215,6 +228,9 @@ def _wms_getcap(self, ogc_server=None): "\nURL: {}\n{}".format(url, content) errors.add(error) log.error(error, exc_info=True) + + self.server_wms_capabilities[ogc_server.id] = (wms, errors) + return wms, errors @cache_region.cache_on_arguments() @@ -1008,7 +1024,9 @@ def _get_functionalities(theme): @staticmethod @view_config(route_name="invalidate", renderer="json") def invalidate_cache(): # pragma: no cover - invalidate_region() + import c2cgeoportal_commons.models.main + + c2cgeoportal_commons.models.main.cache_invalidate_cb() return { "success": True }