From 1d15037d6a3e41c424d6ba905530956adbc374a2 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 29 Sep 2011 15:21:52 -0700 Subject: [PATCH] Further fixes to Managed_DataObject::_allCacheKeys(): now uses self::multicacheKey() to generate the (possibly compound) keys, which makes it match the order of the keys used when calling pkeyGet(). This should resolve the issues darkip was reporting with user_im_prefs entries returning null immediately after insertion (seen with memcached off, so it was happening even with the built-in in-process cache in the Cache base class). What was happening was that the initial pkeyGet() would end up saving a negative cache entry under the form with the fields sorted in the key, as via multicacheKey(): 'statusnet:blaguette:user_im_prefs:screenname,transport:brionv,sms' => 'N;' then we'd do an insert() on the new entry, saving cache entries for the non-sorted key names returned by _allCacheKeys(): 'statusnet:blaguette:user_im_prefs:transport,screenname:sms,brionv' => 'O...' 'statusnet:blaguette:user_im_prefs:user_id,transport:1234,sms' => 'O...' but the next query via pkeyGet() still saw the negative lookup cache from before, and came back with null. Now, _allCacheKeys() sorts the fields in the keys by using the same key-builder function, and queries pick up the same thing you just inserted. :) --- classes/Managed_DataObject.php | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php index ba2883450c..1d55537e20 100644 --- a/classes/Managed_DataObject.php +++ b/classes/Managed_DataObject.php @@ -182,14 +182,13 @@ abstract class Managed_DataObject extends Memcached_DataObject $ckeys = array(); if (!empty($table['unique keys'])) { - foreach ($table['unique keys'] as $idx => $fields) { + $keyNames = $table['unique keys']; + foreach ($keyNames as $idx => $fields) { $val = array(); foreach ($fields as $name) { - $val[] = self::valueString($this->$name); + $val[$name] = self::valueString($this->$name); } - $keys = implode(',', $fields); - $vals = implode(',', $val); - $ckeys[] = $this->cacheKey($this->tableName(), $keys, $vals); + $ckeys[] = self::multicacheKey($this->tableName(), $val); } } @@ -197,11 +196,9 @@ abstract class Managed_DataObject extends Memcached_DataObject $fields = $table['primary key']; $val = array(); foreach ($fields as $name) { - $val[] = self::valueString($this->$name); + $val[$name] = self::valueString($this->$name); } - $keys = implode(',', $fields); - $vals = implode(',', $val); - $ckeys[] = $this->cacheKey($this->tableName(), $keys, $vals); + $ckeys[] = self::multicacheKey($this->tableName(), $val); } return $ckeys; }