From 5ab238c611c1d46efe9e8439e9910d4e78450e7e Mon Sep 17 00:00:00 2001 From: Viranch Mehta Date: Fri, 20 Aug 2021 13:41:04 -0700 Subject: [PATCH] Cache NS1 zones and records for faster re-retrival --- octodns/provider/ns1.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/octodns/provider/ns1.py b/octodns/provider/ns1.py index f87538d..bab7c7b 100644 --- a/octodns/provider/ns1.py +++ b/octodns/provider/ns1.py @@ -85,6 +85,8 @@ class Ns1Client(object): self._feeds_for_monitors = None self._monitors_cache = None self._notifylists_cache = None + self._zones_cache = {} + self._records_cache = {} @property def datasource_id(self): @@ -196,19 +198,43 @@ class Ns1Client(object): return self._try(self._records.create, zone, domain, _type, **params) def records_delete(self, zone, domain, _type): + try: + # remove record from cache + del self._records_cache[zone][domain][_type] + # remove record's zone from cache + del self._zones_cache[zone] + except KeyError: + # never mind if record is not found in cache + pass return self._try(self._records.delete, zone, domain, _type) def records_retrieve(self, zone, domain, _type): - return self._try(self._records.retrieve, zone, domain, _type) + cached = self._records_cache.setdefault(zone, {}) \ + .setdefault(domain, {}) + if _type not in cached: + cached[_type] = self._try(self._records.retrieve, zone, domain, + _type) + return cached[_type] def records_update(self, zone, domain, _type, **params): + try: + # remove record from cache + del self._records_cache[zone][domain][_type] + # remove record's zone from cache + del self._zones_cache[zone] + except KeyError: + # never mind if record is not found in cache + pass return self._try(self._records.update, zone, domain, _type, **params) def zones_create(self, name): return self._try(self._zones.create, name) def zones_retrieve(self, name): - return self._try(self._zones.retrieve, name) + if name not in self._zones_cache: + self._zones_cache[name] = self._try(self._zones.retrieve, name) + print(f'insert {name} to cache with val {self._zones_cache[name]}') + return self._zones_cache[name] def _try(self, method, *args, **kwargs): tries = self.retry_count