changeset 3020:00498b3e4c88 beta

Cleaned the way cache keys are invalidated should fix issue #504 RhodeCode is showing different versions of README on different summary page loads
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 23 Nov 2012 16:59:30 +0100
parents e85380f05a5e
children b2b93614a7cd
files rhodecode/lib/utils.py rhodecode/model/db.py rhodecode/model/scm.py rhodecode/public/css/style.css rhodecode/templates/admin/repos/repo_edit.html
diffstat 5 files changed, 46 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/lib/utils.py	Fri Nov 23 13:27:34 2012 +0100
+++ b/rhodecode/lib/utils.py	Fri Nov 23 16:59:30 2012 +0100
@@ -448,8 +448,10 @@
         # during starting install all cache keys for all repositories in the
         # system, this will register all repos and multiple instances
         key, _prefix, _org_key = CacheInvalidation._get_key(name)
-        log.debug("Creating a cache key for %s instance_id:`%s`" % (name, _prefix))
-        CacheInvalidation._get_or_create_key(key, _prefix, _org_key, commit=False)
+        CacheInvalidation.invalidate(name)
+        log.debug("Creating a cache key for %s instance_id=>`%s`"
+                  % (name, _prefix or '-'))
+
     sa.commit()
     removed = []
     if remove_obsolete:
--- a/rhodecode/model/db.py	Fri Nov 23 13:27:34 2012 +0100
+++ b/rhodecode/model/db.py	Fri Nov 23 16:59:30 2012 +0100
@@ -937,7 +937,7 @@
         """
         set a cache for invalidation for this instance
         """
-        CacheInvalidation.set_invalidate(self.repo_name)
+        CacheInvalidation.set_invalidate(repo_name=self.repo_name)
 
     @LazyProperty
     def scm_instance(self):
@@ -1438,25 +1438,27 @@
         """
         import rhodecode
         prefix = ''
+        org_key = key
         iid = rhodecode.CONFIG.get('instance_id')
         if iid:
             prefix = iid
-        #remove specific suffixes like _README or _RSS
-        key = remove_suffix(key, '_README')
-        key = remove_suffix(key, '_RSS')
-        key = remove_suffix(key, '_ATOM')
-        return "%s%s" % (prefix, key), prefix, key
+
+        return "%s%s" % (prefix, key), prefix, org_key
 
     @classmethod
     def get_by_key(cls, key):
         return cls.query().filter(cls.cache_key == key).scalar()
 
     @classmethod
-    def _get_or_create_key(cls, key, prefix, org_key, commit=True):
+    def get_by_repo_name(cls, repo_name):
+        return cls.query().filter(cls.cache_args == repo_name).all()
+
+    @classmethod
+    def _get_or_create_key(cls, key, repo_name, commit=True):
         inv_obj = Session().query(cls).filter(cls.cache_key == key).scalar()
         if not inv_obj:
             try:
-                inv_obj = CacheInvalidation(key, org_key)
+                inv_obj = CacheInvalidation(key, repo_name)
                 Session().add(inv_obj)
                 if commit:
                     Session().commit()
@@ -1474,30 +1476,38 @@
 
         :param key:
         """
+        repo_name = key
+        repo_name = remove_suffix(repo_name, '_README')
+        repo_name = remove_suffix(repo_name, '_RSS')
+        repo_name = remove_suffix(repo_name, '_ATOM')
 
+        # adds instance prefix
         key, _prefix, _org_key = cls._get_key(key)
-        inv = cls._get_or_create_key(key, _prefix, _org_key)
+        inv = cls._get_or_create_key(key, repo_name)
 
         if inv and inv.cache_active is False:
             return inv
 
     @classmethod
-    def set_invalidate(cls, key):
+    def set_invalidate(cls, key=None, repo_name=None):
         """
-        Mark this Cache key for invalidation
+        Mark this Cache key for invalidation, either by key or whole
+        cache sets based on repo_name
 
         :param key:
         """
+        if key:
+            key, _prefix, _org_key = cls._get_key(key)
+            inv_objs = Session().query(cls).filter(cls.cache_key == key).all()
+        elif repo_name:
+            inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
 
-        key, _prefix, _org_key = cls._get_key(key)
-        inv_objs = Session().query(cls).filter(cls.cache_args == _org_key).all()
-        log.debug('marking %s key[s] %s for invalidation' % (len(inv_objs),
-                                                             _org_key))
+        log.debug('marking %s key[s] for invalidation based on key=%s,repo_name=%s'
+                  % (len(inv_objs), key, repo_name))
         try:
             for inv_obj in inv_objs:
-                if inv_obj:
-                    inv_obj.cache_active = False
-
+                print inv_obj
+                inv_obj.cache_active = False
                 Session().add(inv_obj)
             Session().commit()
         except Exception:
--- a/rhodecode/model/scm.py	Fri Nov 23 13:27:34 2012 +0100
+++ b/rhodecode/model/scm.py	Fri Nov 23 16:59:30 2012 +0100
@@ -291,7 +291,7 @@
 
         :param repo_name: this repo that should invalidation take place
         """
-        CacheInvalidation.set_invalidate(repo_name)
+        CacheInvalidation.set_invalidate(repo_name=repo_name)
 
     def toggle_following_repo(self, follow_repo_id, user_id):
 
--- a/rhodecode/public/css/style.css	Fri Nov 23 13:27:34 2012 +0100
+++ b/rhodecode/public/css/style.css	Fri Nov 23 16:59:30 2012 +0100
@@ -1627,6 +1627,7 @@
 	background: #eee;
 	border-bottom: 1px solid #ddd;
 	padding: 5px 0px 5px 5px;
+	text-align: left;
 }
 
 #content div.box table th.left {
--- a/rhodecode/templates/admin/repos/repo_edit.html	Fri Nov 23 13:27:34 2012 +0100
+++ b/rhodecode/templates/admin/repos/repo_edit.html	Fri Nov 23 16:59:30 2012 +0100
@@ -196,11 +196,20 @@
               </div>
               <div class="field" style="border:none;">
                 ${_('List of cached values')}
-                  <ul>
+                   <table>
+                   <tr>
+                    <th>${_('Prefix')}</th>
+                    <th>${_('Key')}</th>
+                    <th>${_('Active')}</th>
+                    </tr>
                   %for cache in c.repo_info.cache_keys:
-                      <li>INSTANCE ID:${cache.prefix or '-'} ${cache.cache_args} CACHED: ${h.bool2icon(cache.cache_active)}</li>
+                      <tr>
+                        <td>${cache.prefix or '-'}</td> 
+                        <td>${cache.cache_key}</td>
+                        <td>${h.bool2icon(cache.cache_active)}</td>
+                      </tr>
                   %endfor
-                  </ul>
+                  </table>
               </div>
            </div>
         </div>