Page MenuHomePhabricator

CdbReader::get returns incorrect values when opening multiple files
Closed, ResolvedPublic

Description

Exception encountered, of type "BadMethodCallException"
[cbb93f47] / BadMethodCallException from line 80 of /srv/mediawiki/tags/2015-09-08_17:38:19/extensions/Translate/utils/MessageGroupCache.php: Call to a member function get() on a non-object (NULL)
Backtrace:
#0 /srv/mediawiki/tags/2015-09-08_17:38:19/extensions/Translate/messagegroups/MessageGroupBase.php(202): MessageGroupCache->getKeys()
#1 /srv/mediawiki/tags/2015-09-08_17:38:19/extensions/Translate/utils/MessageGroupStats.php(387): MessageGroupBase->initCollection(string)
#2 /srv/mediawiki/tags/2015-09-08_17:38:19/extensions/Translate/utils/MessageGroupStats.php(348): MessageGroupStats::calculateGroup(MediaWikiExtensionMessageGroup, string)
#3 /srv/mediawiki/tags/2015-09-08_17:38:19/extensions/Translate/utils/MessageGroupStats.php(338): MessageGroupStats::forItemInternal(array, MediaWikiExtensionMessageGroup, string)
#4 /srv/mediawiki/tags/2015-09-08_17:38:19/extensions/Translate/utils/MessageGroupStats.php(243): MessageGroupStats::forItemInternal(array, AggregateMessageGroup, string)
#5 /srv/mediawiki/tags/2015-09-08_17:38:19/extensions/Translate/utils/MessageGroupStats.php(99): MessageGroupStats::forLanguageInternal(string)
#6 /srv/mediawiki/tags/2015-09-08_17:38:19/extensions/TwnMainPage/specials/SpecialTwnMainPage.php(-1): MessageGroupStats::forLanguage(string)
#7 /srv/mediawiki/tags/2015-09-08_17:38:19/extensions/TwnMainPage/specials/SpecialTwnMainPage.php(-1): SpecialTwnMainPage->projectSelector()
#8 /srv/mediawiki/tags/2015-09-08_17:38:19/extensions/TwnMainPage/specials/SpecialTwnMainPage.php(-1): SpecialTwnMainPage->makeContent()
#9 /srv/mediawiki/tags/2015-09-08_17:38:19/includes/specialpage/SpecialPage.php(384): SpecialTwnMainPage->execute(NULL)
#10 /srv/mediawiki/tags/2015-09-08_17:38:19/includes/specialpage/SpecialPageFactory.php(553): SpecialPage->run(NULL)
#11 /srv/mediawiki/tags/2015-09-08_17:38:19/includes/MediaWiki.php(249): SpecialPageFactory::executePath(Title, RequestContext)
#12 /srv/mediawiki/tags/2015-09-08_17:38:19/includes/MediaWiki.php(682): MediaWiki->performRequest()
#13 /srv/mediawiki/tags/2015-09-08_17:38:19/includes/MediaWiki.php(476): MediaWiki->main()
#14 /srv/mediawiki/tags/2015-09-05_11:22:53/index.php(41): MediaWiki->run()
#15 {main}

Event Timeline

Nikerabbit raised the priority of this task from to Needs Triage.
Nikerabbit updated the task description. (Show Details)
Nikerabbit added subscribers: Nikerabbit, ori.

Ok it's not open:

			var_dump( get_class( $this->cache ), $this->getCacheFileName(), $this->cache->get( '#version' ) );
			if ( $this->cache->get( '#version' ) !== '3' ) {
				$this->close();
				unlink( $this->getCacheFileName() );

Outputs

string(14) "Cdb\Reader\PHP"
string(94) "/resources/caches/dev.translatewiki.net/groups/translate_groupcache-ext-activitymonitor/en.cdb"
bool(false)

On hexdump I see:

00000a60  00 00 00 01 00 00 00 23  76 65 72 73 69 6f 6e 33  |.......#version3|

Strange:

T111836.php
<?php
require_once __DIR__ . "/src/Util.php";
require_once __DIR__ . "/src/Exception.php";
require_once __DIR__ . "/src/Reader.php";
require_once __DIR__ . "/src/Reader/PHP.php";

use Cdb\Reader;

$cdb = new Reader\PHP( 'en.cdb' );
var_dump( $cdb->get( '#version' ) );
[osmium:~/cdb-tests/cdb-new] $ php5 T111836.php
string(1) "3"
[osmium:~/cdb-tests/cdb-new] $ hhvm T111836.php
string(1) "3"

Hmm. It seems it is not specific to any particular file. It happens after opening around 3-15 different files.

<?php
require_once __DIR__ . "/vendor/autoload.php";

use Cdb\Reader;

$files = glob( "*.cdb" );

foreach ( $files as $file ) {
        $cdb = new Reader\PHP( $file );
        var_dump( $cdb->get( '#version' ) );
}
php foo.php 
string(1) "3"
bool(false)
string(1) "3"
string(1) "3"
string(1) "3"
bool(false)
[Tue Sep  8 20:38:27 2015] [hphp] [14263:7fb9cd404a00:0:000001] [] 
Fatal error: Uncaught exception 'Cdb\Exception' with message 'Error in CDB file "es.cdb", integer too big.' in /home/nike/aewfwef/vendor/wikimedia/cdb/src/Reader/PHP.php:157
Stack trace:
#0 /home/nike/aewfwef/vendor/wikimedia/cdb/src/Reader/PHP.php(201): Cdb\Reader\PHP->readInt31()
#1 /home/nike/aewfwef/vendor/wikimedia/cdb/src/Reader/PHP.php(80): Cdb\Reader\PHP->find()
#2 /home/nike/aewfwef/foo.php(10): Cdb\Reader\PHP->get()
#3 {main}

The output is deterministic, not random if the set of files is the same.

Can you try this test case. It should contain everything needed to reproduce:

Nikerabbit renamed this task from CdbReader::open started returning null after cdb udpate? to CdbReader::get returns incorrect values when opening multiple files.Sep 9 2015, 5:43 AM
Nikerabbit closed this task as Resolved.
Nikerabbit triaged this task as Unbreak Now! priority.

Was resolved by https://gerrit.wikimedia.org/r/#/c/236868/ but this bug was not mentioned.