Last modified: 2014-09-30 10:09:07 UTC

Wikimedia Bugzilla is closed!

Wikimedia migrated from Bugzilla to Phabricator. Bug reports are handled in Wikimedia Phabricator.
This static website is read-only and for historical purposes. It is not possible to log in and except for displaying bug reports and their history, links might be broken. See T73291, the corresponding Phabricator task for complete and up-to-date bug report information.
Bug 71291 - Unexpected non-MediaWiki exception: Can't handle claims with no GUID set!
Unexpected non-MediaWiki exception: Can't handle claims with no GUID set!
Status: RESOLVED WONTFIX
Product: MediaWiki extensions
Classification: Unclassified
WikidataRepo (Other open bugs)
unspecified
All All
: High major (vote)
: ---
Assigned To: Wikidata bugs
u=dev c=backend p=5 s=2014-09-23
:
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2014-09-25 12:09 UTC by tobias.gritschacher
Modified: 2014-09-30 10:09 UTC (History)
4 users (show)

See Also:
Web browser: ---
Mobile Platform: ---
Assignee Huggle Beta Tester: ---


Attachments

Description tobias.gritschacher 2014-09-25 12:09:42 UTC
I get a "Can't handle claims with no GUID set!" exception for some of my items locally. Not sure how it happened that such claims got created but if this also happened on wikidata.org we should handle this more gracefully.

Unexpected non-MediaWiki exception encountered, of type "InvalidArgumentException"
[6fbab4c3] /mediawiki/index.php/Q3552 Exception from line 76 of C:\xampp\htdocs\mediawiki\extensions\Wikibase\vendor\wikibase\data-model\src\Claim\Claims.php: Can't handle claims with no GUID set!
Backtrace:
#0 C:\xampp\htdocs\mediawiki\extensions\Wikibase\vendor\wikibase\data-model\src\Claim\Claims.php(274): Wikibase\DataModel\Claim\Claims->getClaimKey(Wikibase\DataModel\Statement\Statement)
#1 C:\xampp\htdocs\mediawiki\extensions\Wikibase\vendor\wikibase\data-model\src\Claim\Claims.php(44): Wikibase\DataModel\Claim\Claims->offsetSet(NULL, Wikibase\DataModel\Statement\Statement)
#2 C:\xampp\htdocs\mediawiki\extensions\Wikibase\lib\includes\serializers\EntitySerializer.php(148): Wikibase\DataModel\Claim\Claims->__construct(array)
#3 C:\xampp\htdocs\mediawiki\extensions\Wikibase\repo\includes\ParserOutputJsConfigBuilder.php(179): Wikibase\Lib\Serializers\EntitySerializer->getSerialized(Wikibase\DataModel\Entity\Item)
#4 C:\xampp\htdocs\mediawiki\extensions\Wikibase\repo\includes\ParserOutputJsConfigBuilder.php(105): Wikibase\ParserOutputJsConfigBuilder->getSerializedEntity(Wikibase\DataModel\Entity\Item, Wikibase\Lib\Serializers\SerializationOptions)
#5 C:\xampp\htdocs\mediawiki\extensions\Wikibase\repo\includes\ParserOutputJsConfigBuilder.php(82): Wikibase\ParserOutputJsConfigBuilder->getEntityVars(Wikibase\DataModel\Entity\Item, Wikibase\Lib\Serializers\SerializationOptions)
#6 C:\xampp\htdocs\mediawiki\extensions\Wikibase\repo\includes\EntityParserOutputGenerator.php(80): Wikibase\ParserOutputJsConfigBuilder->build(Wikibase\DataModel\Entity\Item, Wikibase\Lib\Serializers\SerializationOptions, boolean)
#7 C:\xampp\htdocs\mediawiki\extensions\Wikibase\repo\includes\content\EntityContent.php(264): Wikibase\EntityParserOutputGenerator->getParserOutput(Wikibase\EntityRevision, boolean, boolean)
#8 C:\xampp\htdocs\mediawiki\extensions\Wikibase\repo\includes\content\EntityContent.php(210): Wikibase\EntityContent->getParserOutputFromEntityView(Title, integer, ParserOptions, boolean)
#9 C:\xampp\htdocs\mediawiki\includes\poolcounter\PoolWorkArticleView.php(139): Wikibase\EntityContent->getParserOutput(Title, integer, ParserOptions)
#10 C:\xampp\htdocs\mediawiki\includes\poolcounter\PoolCounterWork.php(123): PoolWorkArticleView->doWork()
#11 C:\xampp\htdocs\mediawiki\includes\page\Article.php(688): PoolCounterWork->execute()
#12 C:\xampp\htdocs\mediawiki\extensions\Wikibase\repo\includes\actions\ViewEntityAction.php(202): Article->view()
#13 C:\xampp\htdocs\mediawiki\extensions\Wikibase\repo\includes\actions\ViewEntityAction.php(126): Wikibase\ViewEntityAction->displayEntityContent(Wikibase\ItemContent)
#14 C:\xampp\htdocs\mediawiki\includes\MediaWiki.php(414): Wikibase\ViewEntityAction->show()
#15 C:\xampp\htdocs\mediawiki\includes\MediaWiki.php(282): MediaWiki->performAction(Article, Title)
#16 C:\xampp\htdocs\mediawiki\includes\MediaWiki.php(584): MediaWiki->performRequest()
#17 C:\xampp\htdocs\mediawiki\includes\MediaWiki.php(435): MediaWiki->main()
#18 C:\xampp\htdocs\mediawiki\index.php(46): MediaWiki->run()
#19 {main
Comment 1 Aude 2014-09-25 15:11:32 UTC
In the old serializers in lib, Claim(De)Serializer has:

if ( array_key_exists( 'id', $serialization ) ) {                                              
  $claim->setGuid( $serialization['id'] );                                                   
}

so it was optional.

this place in the code does not have any knowledge about what entity we are concerned with and thus don't see nice way to provide fallback and generate one.
Comment 2 Aude 2014-09-25 15:30:21 UTC
in order to use new WikibaseDataModelSerialization component for this, we need https://github.com/wmde/WikibaseDataModelSerialization/issues/88 solved and even then, still think we have the issue.
Comment 3 Aude 2014-09-25 20:29:30 UTC
I removed the claim guid from one of my items, by modifying the item blob in my database.  Using the currently deployed code (mw1.24-wmf19), the item also fails to display and instead get unexpected exception.

If this always fails with the old code we have deployed, then think we would already be aware of this issue before.

i am curious how such an item got created via api?


Unexpected non-MediaWiki exception encountered, of type "InvalidArgumentException"
[6a87291b] /wiki/Q901 Exception from line 88 of /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/data-model/src/Claim/Claims.php: Can't handle claims with no GUID set!
Backtrace:
#0 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/data-model/src/Claim/Claims.php(312): Wikibase\DataModel\Claim\Claims->getClaimKey(Wikibase\DataModel\Claim\Statement)
#1 [internal function]: Wikibase\DataModel\Claim\Claims->offsetSet(NULL, Wikibase\DataModel\Claim\Statement)
#2 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/data-model/src/Claim/Claims.php(158): ArrayObject->append(Wikibase\DataModel\Claim\Statement)
#3 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/data-model/src/Claim/Claims.php(109): Wikibase\DataModel\Claim\Claims->append(Wikibase\DataModel\Claim\Statement)
#4 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/data-model-serialization/src/Deserializers/ClaimsDeserializer.php(48): Wikibase\DataModel\Claim\Claims->addClaim(Wikibase\DataModel\Claim\Statement)
#5 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/data-model-serialization/src/Deserializers/ClaimsDeserializer.php(40): Wikibase\DataModel\Deserializers\ClaimsDeserializer->getDeserialized(array)
#6 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/data-model-serialization/src/Deserializers/EntityDeserializer.php(140): Wikibase\DataModel\Deserializers\ClaimsDeserializer->deserialize(array)
#7 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/data-model-serialization/src/Deserializers/EntityDeserializer.php(67): Wikibase\DataModel\Deserializers\EntityDeserializer->setClaimsFromSerialization(array, Wikibase\DataModel\Entity\Item)
#8 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/data-model-serialization/src/Deserializers/EntityDeserializer.php(51): Wikibase\DataModel\Deserializers\EntityDeserializer->getDeserialized(array)
#9 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/serialization/serialization/src/Deserializers/DispatchingDeserializer.php(42): Wikibase\DataModel\Deserializers\EntityDeserializer->deserialize(array)
#10 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/internal-serialization/src/Deserializers/EntityDeserializer.php(58): Deserializers\DispatchingDeserializer->deserialize(array)
#11 /Library/WebServer/Documents/php-master/extensions/Wikidata/vendor/wikibase/internal-serialization/src/Deserializers/EntityDeserializer.php(38): Wikibase\InternalSerialization\Deserializers\EntityDeserializer->fromCurrentSerialization()
#12 /Library/WebServer/Documents/php-master/extensions/Wikidata/extensions/Wikibase/lib/includes/store/EntityContentDataCodec.php(228): Wikibase\InternalSerialization\Deserializers\EntityDeserializer->deserialize(array)
#13 /Library/WebServer/Documents/php-master/extensions/Wikidata/extensions/Wikibase/repo/includes/content/EntityHandler.php(368): Wikibase\Lib\Store\EntityContentDataCodec->decodeEntity(string, string)
#14 /Library/WebServer/Documents/php-master/includes/Revision.php(1067): Wikibase\EntityHandler->unserializeContent(string, string)
#15 /Library/WebServer/Documents/php-master/includes/Revision.php(1015): Revision->getContentInternal()
#16 /Library/WebServer/Documents/php-master/includes/page/WikiPage.php(679): Revision->getContent(integer, NULL)
#17 /Library/WebServer/Documents/php-master/includes/page/WikiPage.php(496): WikiPage->getContent()
#18 [internal function]: WikiPage->isRedirect()
#19 /Library/WebServer/Documents/php-master/includes/page/Article.php(2002): call_user_func_array(array, array)
#20 /Library/WebServer/Documents/php-master/includes/MediaWiki.php(350): Article->__call(string, array)
#21 /Library/WebServer/Documents/php-master/includes/MediaWiki.php(350): Article->isRedirect()
#22 /Library/WebServer/Documents/php-master/includes/MediaWiki.php(279): MediaWiki->initializeArticle()
#23 /Library/WebServer/Documents/php-master/includes/MediaWiki.php(584): MediaWiki->performRequest()
#24 /Library/WebServer/Documents/php-master/includes/MediaWiki.php(435): MediaWiki->main()
#25 /Library/WebServer/Documents/php-master/index.php(46): MediaWiki->run()
Comment 4 Daniel Kinzler 2014-09-26 15:44:36 UTC
The main problem seems to me that we require "qualified" GUIDs (with the entity ID as a prefix) to be stored in the Statements. That makes it hard to generate a correct GUID in the places where we'd need to do this (like in the deserializer, as a fallback).

We use qualified GUIDs to allow us to identify the Entity the Statement belongs to just by looking at the GUID. That makes the API somewhat simpler. For consistency, it's nice to have the fully qualified GUID in the JSON blob, so people can just take the GUID from the blob and use it in an API call. That's why we have Q123$A2DC667C3... as GUIDs.

I do not see a good way to fix the current situation in a backwards compatible way, without the serializer and/or deserializer for statements knowing about the "present" entity ID, so GUIDs can be generated (or amended to become "qualified" for output, in case we'd be storing unqualified GUIDs in the future).


One thing we could do is using a fake prefix when generating GUIDs for broken/incomplete Statement serializations - e.g. BAD$DEAFBEEFDEADBEEF. That should at least allow us to deserialize and display the statements. They would not be editable using that GUID, though.
Comment 5 Aude 2014-09-26 15:53:54 UTC
I think this is probably a won't fix.

1) if this bug (failure to deserialize an entity) happens on currently deployed code, then think it's likely we already would be aware of it.

2) I am able to deserialize everything from a dump (may 26) using master Wikibase, which makes me think we have no such items in Wikidata. I might try with newer (but before serialization switch) dump.

If we really want a 'fix', maybe hack in what daniel suggests and add debug / deprecation logging which we could actually collect in production so we have more information about the issue.
Comment 6 Aude 2014-09-26 15:54:49 UTC
also, i tried on currently deployed code (and master) to add claims without guids using wbeditentity and wbsetclaim.  It wasn't possible to do so.
Comment 7 Lydia Pintscher 2014-09-30 10:09:07 UTC
wontfix as discussed with Katie

Note You need to log in before you can comment on or make changes to this bug.


Navigation
Links