403b09
From a9ebd731b23ebf9a56401139fe20dafc50322ff3 Mon Sep 17 00:00:00 2001
403b09
From: David Kupka <dkupka@redhat.com>
403b09
Date: Tue, 16 Aug 2016 15:32:47 +0200
403b09
Subject: [PATCH] schema cache: Read schema instead of rewriting it when
403b09
 SchemaUpToDate
403b09
403b09
https://fedorahosted.org/freeipa/ticket/6048
403b09
403b09
Reviewed-By: Jan Cholasta <jcholast@redhat.com>
403b09
---
403b09
 ipaclient/remote_plugins/schema.py | 46 ++++++++++++++++++++------------------
403b09
 1 file changed, 24 insertions(+), 22 deletions(-)
403b09
403b09
diff --git a/ipaclient/remote_plugins/schema.py b/ipaclient/remote_plugins/schema.py
403b09
index 2fc6cce3eca392447cd4230216900116002934f4..e8b3f61bd8460c60630e8710028da79654819bd1 100644
403b09
--- a/ipaclient/remote_plugins/schema.py
403b09
+++ b/ipaclient/remote_plugins/schema.py
403b09
@@ -17,6 +17,7 @@ import six
403b09
 
403b09
 from ipaclient.frontend import ClientCommand, ClientMethod
403b09
 from ipalib import errors, parameters, plugable
403b09
+from ipalib.errors import SchemaUpToDate
403b09
 from ipalib.frontend import Object
403b09
 from ipalib.output import Output
403b09
 from ipalib.parameters import DefaultFrom, Flag, Password, Str
403b09
@@ -439,15 +440,14 @@ class Schema(object):
403b09
             self._dict[ns] = {}
403b09
             self._namespaces[ns] = _SchemaNameSpace(self, ns)
403b09
 
403b09
-        is_known = False
403b09
-        if not api.env.force_schema_check:
403b09
-            try:
403b09
-                self._fingerprint = server_info['fingerprint']
403b09
-                self._expiration = server_info['expiration']
403b09
-            except KeyError:
403b09
-                pass
403b09
-            else:
403b09
-                is_known = True
403b09
+        try:
403b09
+            self._fingerprint = server_info['fingerprint']
403b09
+            self._expiration = server_info['expiration']
403b09
+        except KeyError:
403b09
+            is_known = False
403b09
+        else:
403b09
+            is_known = (not api.env.force_schema_check and
403b09
+                        self._expiration > time.time())
403b09
 
403b09
         if is_known:
403b09
             try:
403b09
@@ -461,14 +461,15 @@ class Schema(object):
403b09
             self._fetch(client)
403b09
         except NotAvailable:
403b09
             raise
403b09
+        except SchemaUpToDate as e:
403b09
+            self._fingerprint = e.fingerprint
403b09
+            self._expiration = time.time() + e.ttl
403b09
+            self._read_schema()
403b09
         else:
403b09
             self._write_schema()
403b09
-        finally:
403b09
-            try:
403b09
-                server_info['fingerprint'] = self._fingerprint
403b09
-                server_info['expiration'] = self._expiration
403b09
-            except AttributeError:
403b09
-                pass
403b09
+
403b09
+        server_info['fingerprint'] = self._fingerprint
403b09
+        server_info['expiration'] = self._expiration
403b09
 
403b09
     @contextlib.contextmanager
403b09
     def _open(self, filename, mode):
403b09
@@ -501,21 +502,22 @@ class Schema(object):
403b09
             schema = client.forward(u'schema', **kwargs)['result']
403b09
         except errors.CommandError:
403b09
             raise NotAvailable()
403b09
-        except errors.SchemaUpToDate as e:
403b09
-            fp = e.fingerprint
403b09
-            ttl = e.ttl
403b09
-        else:
403b09
+
403b09
+        try:
403b09
             fp = schema['fingerprint']
403b09
-            ttl = schema.pop('ttl', 0)
403b09
-            schema.pop('version', None)
403b09
+            ttl = schema.pop('ttl')
403b09
+            schema.pop('version')
403b09
 
403b09
             for key, value in schema.items():
403b09
                 if key in self.namespaces:
403b09
                     value = {m['full_name']: m for m in value}
403b09
                 self._dict[key] = value
403b09
+        except KeyError as e:
403b09
+            logger.warning("Failed to fetch schema: %s", e)
403b09
+            raise NotAvailable()
403b09
 
403b09
         self._fingerprint = fp
403b09
-        self._expiration = ttl + time.time()
403b09
+        self._expiration = time.time() + ttl
403b09
 
403b09
     def _read_schema(self):
403b09
         self._file.truncate(0)
403b09
-- 
403b09
2.7.4
403b09