[horde] Cache slowly filling up with driver File

Arjen de Korte arjen+horde at de-korte.org
Mon Apr 27 20:07:29 UTC 2015


Citeren Michael J Rubinsky <mrubinsk at horde.org>:

> Quoting Arjen de Korte <arjen+horde at de-korte.org>:
>
>> I use the filebased cache, which stores data on a tmpfs. Works fine  
>> except for one slight problem, the number of files cached doesn't  
>> stabilize at all, it keeps growing.
>>
>> Right after cleaning the cache partition, almost all cached files  
>> are listed in the 'horde_cache_gc', so eventually these will be  
>> caught during garbage collection. But I also see the number of  
>> files that are *not* listed growing every day (which as far as I  
>> can see, means these will never be removed).
>>
>> I see that in many places, no explicit lifetime is set when storing  
>> an entry in the cache (for instance, the information retrieved by  
>> the weather info), so these will never be GC'd as only files with  
>> non-zero lifetime will make it into the 'horde_cache_gc'.
>
> This isn't 100% true. When a cache value is requested from the  
> cache, a $lifetime parameter can also be supplied. So, e.g., in the  
> case of Horde_Service_Weather, we specify the $lifetime when reading  
> the cache. If the $lifetime expired, then the cache library will (in  
> the case of a file based backend) unlink the cache file. Granted,  
> since this only happens when the specific cache key is requested, I  
> see how this could lead to certain cache files perhaps never being  
> GC'd if, again using Horde_Service_Weather as an example, weather  
> location was requested once, and never requested again.
>
>> Wouldn't it be a better idea to let *any* file stored in the  
>> filebased cache timeout to prevent them from piling up?
>
> For some data, sure, it might make sense to add a $lifetime  
> parameter to the set() method if it doesn't already exist, but not  
> all data necessarily should be automatically expired.

I put a Horde::debug statement in the File.php set() method that logs  
data with lifetime zero (ie, cache entries which will never be GC'd).  
The resulting log file worries me a little, since all entries seem to  
be Horde_History_Log ones. Since the data is also stored in the  
database, I think storing them in the cache permanently is not needed  
and instead the default cache lifetime would be appropriate for this  
data:

--- History.php.orig    2014-11-18 20:16:53.300494861 +0100
+++ History.php 2015-04-27 21:57:01.069877539 +0200
@@ -169,7 +169,7 @@ abstract class Horde_History

          $history = $this->_getHistory($guid);
          if ($this->_cache) {
-            $this->_cache->set('horde:history:' . $guid,  
serialize($history), 0);
+            $this->_cache->set('horde:history:' . $guid,  
serialize($history));
          }

          return $history;

--- History/Composite.php.orig  2014-11-18 20:16:53.300494861 +0100
+++ History/Composite.php       2015-04-27 22:01:07.033756773 +0200
@@ -115,7 +115,7 @@ class Horde_History_Composite extends Ho
              $history = new Horde_History_Log($guid, $data);

              if ($this->_cache) {
-                $this->_cache->set($cid, serialize($history), 0);
+                $this->_cache->set($cid, serialize($history));
              }
          }

For many cache backends this is probably not an issue (since they will  
automatically evict old cache entries), but the filesystem cache  
relies solely on the GC to do this.

-- 
This message was sent from a mailinglist subscription address.
For off-list replies, you must remove the address extension.



More information about the horde mailing list