Yurik has uploaded a new change for review.
https://gerrit.wikimedia.org/r/263160
Change subject: Cache JSON objects in memcached
......................................................................
Cache JSON objects in memcached
* The graph data should now be available immediatelly
after parsing, without waiting for SQL replication
* Graph URL will now continue working for some time
after being removed from the page. This is not
a complete solution, and we will need to implement
something more permanent for the older graphs.
Change-Id: I0c6bc4bb4aa21d4b1647e04601806da345a008ef
---
M includes/ApiGraph.php
M includes/Graph.body.php
2 files changed, 49 insertions(+), 20 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Graph
refs/changes/60/263160/1
diff --git a/includes/ApiGraph.php b/includes/ApiGraph.php
index 09b69a0..3adef4c 100644
--- a/includes/ApiGraph.php
+++ b/includes/ApiGraph.php
@@ -88,28 +88,31 @@
* @return string
*/
private function getFromStorage( $title, $hash ) {
- $title = Title::newFromText( $title );
- if ( !$title || !$title->exists() || !$title->userCan( 'read',
$this->getUser() ) ) {
- $this->dieUsage( "Invalid title given.", "invalidtitle"
);
- }
+ $graph = Singleton::getDataByHash( $hash );
- $ppValue = $this->getDB()->selectField( 'page_props',
'pp_value', array(
- 'pp_page' => $title->getArticleID(),
- 'pp_propname' => 'graph_specs',
- ), __METHOD__ );
-
- $graph = false;
- if ( $ppValue ) {
- // Copied from TemplateDataBlob.php:newFromDatabase()
- // Handle GZIP compression. \037\213 is the header for
GZIP files.
- if ( substr( $ppValue, 0, 2 ) === "\037\213" ) {
- $ppValue = gzdecode( $ppValue );
+ if ( !$graph ) {
+ $title = Title::newFromText( $title );
+ if ( !$title || !$title->exists() || !$title->userCan(
'read', $this->getUser() ) ) {
+ $this->dieUsage( "Invalid title given.",
"invalidtitle" );
}
- $st = FormatJson::parse( $ppValue );
- if ( $st->isOK() ) {
- $allGraphs = $st->getValue();
- if ( property_exists( $allGraphs, $hash ) ) {
- $graph = $allGraphs->$hash;
+
+ $ppValue = $this->getDB()->selectField( 'page_props',
'pp_value', array(
+ 'pp_page' => $title->getArticleID(),
+ 'pp_propname' => 'graph_specs',
+ ), __METHOD__ );
+
+ if ( $ppValue ) {
+ // Copied from
TemplateDataBlob.php:newFromDatabase()
+ // Handle GZIP compression. \037\213 is the
header for GZIP files.
+ if ( substr( $ppValue, 0, 2 ) === "\037\213" ) {
+ $ppValue = gzdecode( $ppValue );
+ }
+ $st = FormatJson::parse( $ppValue );
+ if ( $st->isOK() ) {
+ $allGraphs = $st->getValue();
+ if ( property_exists( $allGraphs, $hash
) ) {
+ $graph = $allGraphs->$hash;
+ }
}
}
}
diff --git a/includes/Graph.body.php b/includes/Graph.body.php
index 0c06206..e587138 100644
--- a/includes/Graph.body.php
+++ b/includes/Graph.body.php
@@ -189,6 +189,8 @@
$specs[$hash] = $data;
$parserOutput->setExtensionData( 'graph_specs', $specs );
+ self::saveDataToCache( $hash, $data );
+
if ( $isPreview || !$wgGraphImgServiceUrl ) {
// Always do client-side rendering
$attribs = self::buildDivAttributes( 'always', $data,
$hash );
@@ -197,6 +199,7 @@
$parserOutput->setExtensionData( 'graph_live_specs',
$liveSpecs );
$html = ''; // will be injected with a <canvas> tag
} else {
+
// Image from Graphoid
$server = rawurlencode( $wgServerName );
$title = !$title ? '' : rawurlencode(
$title->getPrefixedDBkey() );
@@ -237,6 +240,28 @@
return Html::rawElement( 'div', $attribs, $html );
}
+
+ /**
+ * Store graph data in the memcached
+ * @param $hash string
+ * @param $data mixed
+ */
+ private static function saveDataToCache( $hash, $data ) {
+ /** @var $wgMemc \BagOStuff */
+ global $wgMemc;
+ $wgMemc->add( $wgMemc->makeKey( 'graph-data', $hash ), $data );
+ }
+
+ /**
+ * Gets data for a key, or false on failure
+ * @param $hash string
+ * @return mixed
+ */
+ public static function getDataByHash( $hash ) {
+ /** @var $wgMemc \BagOStuff */
+ global $wgMemc;
+ return $wgMemc->get( $wgMemc->makeKey( 'graph-data', $hash ) );
+ }
}
/**
@@ -260,6 +285,7 @@
protected function fillParserOutput( Title $title, $revId,
ParserOptions $options, $generateHtml,
ParserOutput &$output ) {
+ /** @var $wgParser Parser */
global $wgParser;
$text = $this->getNativeData();
$parser = $wgParser->getFreshParser();
--
To view, visit https://gerrit.wikimedia.org/r/263160
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0c6bc4bb4aa21d4b1647e04601806da345a008ef
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Graph
Gerrit-Branch: master
Gerrit-Owner: Yurik <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits