https://bugzilla.wikimedia.org/show_bug.cgi?id=44024

       Web browser: ---
            Bug ID: 44024
           Summary: ObjectCache changes in 1.20.x break XCache 3.x support
           Product: MediaWiki
           Version: 1.20.2
          Hardware: PC
                OS: Linux
            Status: UNCONFIRMED
          Severity: normal
          Priority: Unprioritized
         Component: General/Unknown
          Assignee: [email protected]
          Reporter: [email protected]
                CC: [email protected]
    Classification: Unclassified
   Mobile Platform: ---

I recently faced the exact same problem as described in this old Maillist
thread:
http://www.gossamer-threads.com/lists/engine?do=post_view_printable;post=307511;list=wiki

The problem is, that MediaWiki in the 1.20.x Branch with at least XCache 3.x
(didn't test another XCache version) takes more then 10 seconds to process
every request. The reason for that is a loop with a 10 seconds timeout within
"MessageCache::load": 
-------------------------------------
...
Article::view                                                                  
 1     10064.915     10064.915        99.300%   1640737  (    10064.915 -   
10064.915) [291]
MessageCache::load                                                             
 1     10037.354     10037.354        99.028%      1606  (    10037.354 -   
10037.354) [1]
OutputPage::output                                                             
 1        43.939        43.939         0.434%   1838602  (       43.939 -      
43.939) [583]
Output-skin                                                                    
 1        43.630        43.630         0.430%   1827387  (       43.630 -      
43.630) [582]
...
-------------------------------------

The speculation within the maillist thread was that it was some sort of XCache
configuration issue, but everything seemed to be fine for me and before the
hangup MediaWiki was already succesfully able to add values to the VarCache
like

mediawikitest-wiki2_:user:id:1
mediawikitest-wiki2_:resourceloader:filter:...

So i debugged my way through the code and came to the conclusion that the
reason for the broken XCache support in 1.20.x are the changes made to the
BagOStuff->add function:

1.19:
----------------------------------
    public function add( $key, $value, $exptime = 0 ) {
        if ( !$this->get( $key ) ) {
            $this->set( $key, $value, $exptime );

            return true;
        }
    }
------------------------------------

1.20:
------------------------------------
    public function add( $key, $value, $exptime = 0 ) {
        if ( $this->get( $key ) === false ) {
            return $this->set( $key, $value, $exptime );
        }
        return false; // key already set
    }
------------------------------------

The other keys like "mediawikitest-wiki2_:user:id:1" work fine, because
MediaWiki there does not use the add function, but the set function directly
instead.
So the changes now break the XCache support, because "get" basically returns
the returnvalue of "xcache_get" (serialising aside, because that is a non issue
here). It is basically the same function for XCache and APC and this might
still work for APC because apc_fetch does infact return "false" in case the key
is not found. This is not the case for XCache!
xcache_get simply does not return false in case of a not found key (its an
empty string), which causes the new BagOStuff->add function to believe that the
key has already been set. 

Assuming the changes to the add function were made for a reason, the easiest
way to fix this seems to modify the XCacheBagOStuff->get function to handle not
yet set keys correctly as intended by XCache, which then would result in
something like this: 

-----------------------------------------
class XCacheBagOStuff extends BagOStuff {
        /**
         * Get a value from the XCache object cache
         *
         * @param $key String: cache key
         * @return mixed
         */
        public function get( $key ) {
                if (!xcache_isset( $key )) { return false; }

                $val = xcache_get( $key );

                if ( is_string( $val ) ) {
                        if ( $this->isInteger( $val ) ) {
                                $val = intval( $val );
                        } else {
                                $val = unserialize( $val );
                        }
                }

                return $val;
        }

-----------------------------------------

With this simple modification it now works fine for me.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
You are the assignee for the bug.
You are watching all bug changes.
_______________________________________________
Wikibugs-l mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/wikibugs-l

Reply via email to