[pdo-experimental] Could not update headlines (invalid object received - see error console for details)

As requested I’ve tried updating my tt-rss install to the pdo-experimental branch. I did the schema updates and then did a log in with a user account just fine.

I’ve seen the error “Could not update headlines (invalid object received - see error console for details)” three times now. I think it is related to right clicking on a feed name and doing “Mark as read”. The feed contents panel clears and is then shortly after replaced by the error message.

versions

tt-rss git pdo-experimental (83a052f1f), ubuntu 16.04, mysql, Apache 2.4, PHP 7.0.22-0ubuntu0.16.04.1

looking at plugins I have auth_internal and note enabled.

The web server error log contains

[Sun Dec 10 17:28:37.843707 2017] [:error] [pid 5000] [client 192.168.1.118:49799] PHP Fatal error: Uncaught PDOException: There is no active transaction in /var/www/tracks.oldelvet.org.uk/tt-rss/classes/rssutils.php:1159\nStack trace:\n#0 /var/www/tracks.oldelvet.org.uk/tt-rss/classes/rssutils.php(1159): PDO->commit()\n#1 /var/www/tracks.oldelvet.org.uk/tt-rss/classes/feeds.php(205): RSSUtils::update_rss_feed(121, true)\n#2 /var/www/tracks.oldelvet.org.uk/tt-rss/classes/feeds.php(904): Feeds->format_headlines_list(121, 'ForceUpdate', 'adaptive', 30, false, 0, NULL, false, true, NULL, false)\n#3 /var/www/tracks.oldelvet.org.uk/tt-rss/backend.php(123): Feeds->view()\n#4 {main}\n thrown in /var/www/tracks.oldelvet.org.uk/tt-rss/classes/rssutils.php on line 1159

and the appropriate log from the browser error console (although I’m guessing the webserver side of things is most interesting).

PluginHost::run 4
tt-rss:534:79
SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data
Stack trace:
handle_rpc_json@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:104:178
headlines_callback2@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:351:806
onComplete@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:305:207
respondToReadyState@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1827:8
onStateChange@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1756:7
EventHandlerNonNull*request@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1737:43
initialize@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1706:5
wrap/<@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:449:14
klass@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:82:7
viewfeed/_viewfeed_timeout<@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:305:67
setTimeout handler*viewfeed@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:305:45
onClick@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:47:443
__click@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:399204
_onClick@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:399322
postCreate/<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:391391
dojo/on/</on.selector/</<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:53134
EventListener.handleEvent*_1fb@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:52250
dojo/on/</on.parse@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:51776
on@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:50969
_54d@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:151424
dojo/on/</on.parse@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:51447
on@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:50969
dojo/on/</on.selector/<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:53038
dojo/on/</on.parse@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:51447
on@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:50969
postCreate@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:391321
_19f@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:41978
postCreate@https://tracks.oldelvet.org.uk/tt-rss/js/FeedTree.js?1512927223781:225:4
create@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:143152
postscript@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:142292
_1b8/<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:43906
updateFeedList@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:47:291
init_second_stage@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:69:30
backend_sanity_check_callback@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:248:24
onComplete@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:61:507
respondToReadyState@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1827:8
onStateChange@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1756:7
EventHandlerNonNull*request@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1737:43
initialize@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1706:5
wrap/<@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:449:14
klass@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:82:7
init/</<@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:61:317
dojo/ready/</dojo.addOnLoad/_185<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:37022
_181@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:36647
req.signal/<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:3806
_9@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:328
req.signal@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:3771
_38@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:13709
_81@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:13758
_f6@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:15537
_10b@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:18464
EventListener.handleEvent*_104@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:17780
req.injectUrl@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:18479
_33@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:16472
_9@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:328
_7c/<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:7232
_38@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:13659
_7c@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:7217
_16@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:7883
req@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:555
init@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:60:130
@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:563:4
createResponder/<@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:7268:7
EventListener.handleEvent*observeStandardEvent@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:7015:7
observe@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:7007:7
@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:562:3
tt-rss:113:52
headlines_callback2 [offset=0] B:false I:false
tt-rss:351:833
SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data
Stack trace:
headlines_callback2@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:351:983
onComplete@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:305:207
respondToReadyState@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1827:8
onStateChange@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1756:7
EventHandlerNonNull*request@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1737:43
initialize@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1706:5
wrap/<@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:449:14
klass@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:82:7
viewfeed/_viewfeed_timeout<@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:305:67
setTimeout handler*viewfeed@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:305:45
onClick@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:47:443
__click@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:399204
_onClick@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:399322
postCreate/<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:391391
dojo/on/</on.selector/</<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:53134
EventListener.handleEvent*_1fb@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:52250
dojo/on/</on.parse@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:51776
on@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:50969
_54d@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:151424
dojo/on/</on.parse@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:51447
on@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:50969
dojo/on/</on.selector/<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:53038
dojo/on/</on.parse@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:51447
on@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:50969
postCreate@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:391321
_19f@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:41978
postCreate@https://tracks.oldelvet.org.uk/tt-rss/js/FeedTree.js?1512927223781:225:4
create@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:143152
postscript@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/tt-rss-layer.js?1493037672:8:142292
_1b8/<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:43906
updateFeedList@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:47:291
init_second_stage@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:69:30
backend_sanity_check_callback@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:248:24
onComplete@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:61:507
respondToReadyState@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1827:8
onStateChange@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1756:7
EventHandlerNonNull*request@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1737:43
initialize@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:1706:5
wrap/<@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:449:14
klass@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:82:7
init/</<@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:61:317
dojo/ready/</dojo.addOnLoad/_185<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:37022
_181@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:36647
req.signal/<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:3806
_9@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:328
req.signal@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:3771
_38@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:13709
_81@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:13758
_f6@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:15537
_10b@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:18464
EventListener.handleEvent*_104@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:17780
req.injectUrl@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:18479
_33@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:16472
_9@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:328
_7c/<@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:7232
_38@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:13659
_7c@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:7217
_16@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:7883
req@https://tracks.oldelvet.org.uk/tt-rss/lib/dojo/dojo.js?1493037671:8:555
init@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:60:130
@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:563:4
createResponder/<@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:7268:7
EventListener.handleEvent*observeStandardEvent@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:7015:7
observe@https://tracks.oldelvet.org.uk/tt-rss/lib/prototype.js?1493037672:7007:7
@https://tracks.oldelvet.org.uk/tt-rss/#f=196&c=0:562:3
tt-rss:351:1028
Invalid object received: 
tt-rss:368:26
PluginHost::run 5

I think I’ve done all the database updates. I haven’t tried a fresh browser profile yet but given there is a PDO error I’m suspecting I either have something missing in my Apache/PHP installation or there is something amiss in the new PDO code.

so this only happens when you mark feed as read? the error is related to on-demand feed update tt-rss has, most likely there’s a race condition with feed either being updated and marked as read at the same time or concurrently updated by whatever update method you are using and tt-rss frontend.

in all honesty frontend updates are a kludge so maybe they should be removed altogether. still, even if frontend update fails it shouldn’t break the UI so i guess i’ll wrap this into try-catch or something for now.

btw on-demand updates are only enabled if you don’t have open_basedir enabled. which is a good option to have turned on, just saying.

e: if this only happens for a specific feed post the feed URL here and check for other SQL errors in your logs.

I’ve checked and it happens on at least 4 different feeds.

Will try setting open_basedir later tonight.

try setting logging to sql and check if any sql errors appear during normal feed updates, particularly for those feeds

you normally won’t notice those since they don’t cause ui errors

Just checked the Error Log (without changing any config) and the following errors seem to be repeating.

Error 	Filename 	Message 	User 	Date
E_ERROR (1)	classes/rssutils.php:1159	Uncaught PDOException: There is no active transaction in /var/www/tracks.oldelvet.org.uk/tt-rss/classes/rssutils.php:1159 Stack trace: #0 /var/www/tracks.oldelvet.org.uk/tt-rss/classes/rssutils.php(1159): PDO->commit() #1 /var/www/tracks.oldelvet.org.uk/tt-rss/classes/rssutils.php(185): RSSUtils::update_rss_feed('32', true, false) #2 /var/www/tracks.oldelvet.org.uk/tt-rss/update.php(168): RSSUtils::update_daemon_common() #3 {main} thrown		20:00
E_WARNING (2)	classes/rssutils.php:1076	PDOStatement::execute(): SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`ttrss`.`ttrss_enclosures`, CONSTRAINT `ttrss_enclosures_ibfk_1` FOREIGN KEY (`post_id`) REFERENCES `ttrss_entries` (`id`) ON DELETE CASCADE)1. classes/rssutils.php(1076): execute(Array)
2. classes/rssutils.php(185): update_rss_feed(32, 1, )
3. update.php(168): update_daemon_common()
		20:00
E_WARNING (2)	classes/rssutils.php:959	PDOStatement::execute(): SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: 'NOW()' for column 'last_marked' at row 11. classes/rssutils.php(959): execute(Array)
2. classes/rssutils.php(185): update_rss_feed(32, 1, )
3. update.php(168): update_daemon_common()

OK. So I dug a bit deeper and part of the problem (if not all of it) is the use of NOW() for last_marked and last_published fields. Given that the value is either NOW() or null I have moved those values into a string concatenation within the prepare at rssutils.php around line 953.

I can provide a git patch if you like (but will have to read the instructions for how you like it submitting).

Pull request submitted on Gogs. https://git.tt-rss.org/git/tt-rss/pulls/26 Feeds are now updating on my install.

ah right i guess those get quoted when used as bound parameters, thanks.