summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Prodromou <evan@status.net>2010-12-06 17:05:32 -0500
committerEvan Prodromou <evan@status.net>2010-12-06 17:05:32 -0500
commitb3d47ed6cc3245ddf2f54343b4783fde05708c00 (patch)
tree8f3906f70ba42ab163164cc7f3caf3da8608bbc4
parentda8b268e06f4a6217c2bbb4918888001f8e7e4cd (diff)
Make code-dependent cache entries more volatile
If a cache entry is dependent on the code that's running, upgrading (or enabling/disabling plugins) can generate hard-to-track inconsistencies. This change adds a close-to-unique fingerprint of the running code to some cache keys, so that if the fingerprint changes, the old values are ignored and new values are used. If the automated uniqueness fails, an administrator can add an extra config value, $config['site']['build'], that's thrown into the key also.
-rw-r--r--lib/cache.php49
-rw-r--r--lib/default.php3
2 files changed, 51 insertions, 1 deletions
diff --git a/lib/cache.php b/lib/cache.php
index ea0ff769d..dc667654a 100644
--- a/lib/cache.php
+++ b/lib/cache.php
@@ -87,6 +87,55 @@ class Cache
}
/**
+ * Create a cache key for data dependent on code
+ *
+ * For cache elements that are dependent on changes in code, this creates
+ * a more-or-less fingerprint of the current running code and adds it to
+ * the cache key. In the case of an upgrade of core, or addition or
+ * removal of plugins, a new unique fingerprint is generated and used.
+ *
+ * There can still be problems with a) differences in versions of the
+ * plugins and b) people running code between official versions. This is
+ * usually a problem only for experienced users like developers, who know
+ * how to clear their cache.
+ *
+ * For sites that run code between versions (like the status.net cloud),
+ * there's an additional build number configuration setting.
+ *
+ * @param string $extra the real part of the key
+ *
+ * @return string full key
+ */
+
+ static function codeKey($extra)
+ {
+ static $prefix = null;
+
+ if (empty($prefix)) {
+
+ $plugins = StatusNet::getActivePlugins();
+ $names = array();
+
+ foreach ($plugins as $plugin) {
+ $names[] = $plugin[0];
+ }
+
+ $names = array_unique($names);
+ asort($names);
+
+ // Unique enough.
+
+ $uniq = crc32(implode(',', $names));
+
+ $build = common_config('site', 'build');
+
+ $prefix = STATUSNET_VERSION.':'.$build.':'.$uniq;
+ }
+
+ return Cache::key($prefix.':'.$extra);
+ }
+
+ /**
* Make a string suitable for use as a key
*
* Useful for turning primary keys of tables into cache keys.
diff --git a/lib/default.php b/lib/default.php
index a91fa338f..7388046d3 100644
--- a/lib/default.php
+++ b/lib/default.php
@@ -59,7 +59,8 @@ $default =
'textlimit' => 140,
'indent' => true,
'use_x_sendfile' => false,
- 'notice' => null // site wide notice text
+ 'notice' => null, // site wide notice text
+ 'build' => 1, // build number, for code-dependent cache
),
'db' =>
array('database' => 'YOU HAVE TO SET THIS IN config.php',