Mwalker has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/96723


Change subject: Adding in the render pipeline
......................................................................

Adding in the render pipeline

Change-Id: Ia1b70f1c1418137bae2673fef120ebe233bf8dde
---
M defaults.json
M lib/JobDetails.js
M lib/backend.js
3 files changed, 85 insertions(+), 9 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Collection/OfflineContentGenerator
 refs/changes/23/96723/1

diff --git a/defaults.json b/defaults.json
index bc32ac3..d46df83 100644
--- a/defaults.json
+++ b/defaults.json
@@ -19,11 +19,18 @@
                "status_set_name": "job_status"
        },
        "backend": {
+               "bundler": {
+                       "bin": "./bundler/bin/mw-bundler",
+                       "parsoid_api": "http://localhost/";,
+                       "parsoid_prefix": "localhost"
+               },
                "writers": {
-                       "rdf2latex": "./latex_renderer/bin/mw-latexer"
+                       "rdf2latex": {
+                               "bin": "./latex_renderer/bin/mw-latexer",
+                               "extension": ".pdf"
+                       }
                },
 
-               "temp_dir": null,
-               "bundler_bin": "./bundler/bin/mw-bundler"
+               "temp_dir": null
        }
 }
\ No newline at end of file
diff --git a/lib/JobDetails.js b/lib/JobDetails.js
index be720b7..c784888 100644
--- a/lib/JobDetails.js
+++ b/lib/JobDetails.js
@@ -128,6 +128,16 @@
        jd.status.process = progress;
        jd.status.page = page;
 };
+exports.updateFinished = function(jd, file) {
+       jd.timestamp = new Date();
+       jd.state = 'finished';
+       jd.renderedFileLoc = file;
+
+       jd.status.status = '';
+       jd.status.article = null;
+       jd.status.process = 100;
+       jd.status.page = '';
+};
 exports.updateError = function(jd, error) {
        jd.timestamp = new Date();
        jd.state = 'failed';
diff --git a/lib/backend.js b/lib/backend.js
index 4b9112f..eeeb960 100644
--- a/lib/backend.js
+++ b/lib/backend.js
@@ -130,13 +130,20 @@
 
 function runBundler(jobDetails, metabookPath) {
        var child;
-       var bundle = path.join(config.get('backend:temp_dir'), 
jobDetails.collectionId + '.zip');
+       var bundleFile = path.join(config.get('backend:temp_dir'), 
jobDetails.collectionId + '.zip');
 
        // TODO: Don't do this if we have a cached bundle
-       console.debug('Forking child to run job id %s, %s', 
jobDetails.collectionId, '-m ' + metabookPath);
-       child = child_process.fork(config.get('backend:bundler_bin'), [
+       console.debug(
+               'Forking child bundler to run job id %s (input: %s, output: 
%s)',
+               jobDetails.collectionId,
+               metabookPath,
+               bundleFile
+       );
+       child = child_process.fork(config.get('backend:bundler:bin'), [
+               '-p', config.get('backend:bundler:parsoid_prefix'),
+               '-a', config.get('backend:bundler:parsoid_api'),
                '-m', metabookPath,
-               '-o', bundle
+               '-o', bundleFile
        ]);
        child.on('error', function(err) {
                console.error('Bundler child reported back with spawn error: 
%s', err);
@@ -158,8 +165,9 @@
                        );
                        getNewItemFromQueue();
                } else {
-                       // TODO: Actually launch off the next process
-                       getNewItemFromQueue();
+                       // OK: Bundler completed, now launch the renderer
+                       console.debug('Bundle completed successfully!');
+                       runRenderer(jobDetails, bundleFile);
                }
        });
 
@@ -169,6 +177,57 @@
        redisClient.hset(config.get('redis:status_set_name'), 
jobDetails.collectionId, JSON.stringify(jobDetails));
 }
 
+function runRenderer(jobDetails, bundleFile) {
+       // TODO: It isn't safe to not check the writer (aka, do we have 
configuration for it)
+       var writer = jobDetails.writer;
+       var renderFile = path.join(
+               config.get('backend:temp_dir'),
+               jobDetails.collectionId + config.get('backend:writers:' + 
writer + ':extension')
+       );
+
+       console.debug(
+               'Forking child renderer to run job id %s (input: %s, output: 
%s)',
+               jobDetails.collectionId,
+               bundleFile,
+               renderFile
+       );
+       child = child_process.fork(config.get('backend:writers:' + writer + 
':bin'), [
+               '-t',
+               '-o', renderFile,
+               bundleFile
+       ]);
+       child.on('error', function(err) {
+               console.error('Renderer child reported back with spawn error: 
%s', err);
+               jd.updateError(jobDetails, 'Could not launch rendering 
process');
+               redisClient.hset(config.get('redis:status_set_name'), 
jobDetails.collectionId, JSON.stringify(jobDetails));
+               getNewItemFromQueue();
+       });
+       child.on('message', function(message, handle) {
+               console.info('Received message from child! %s', message);
+       });
+       child.on('exit', function(code, signal) {
+               console.info('Rendering child exited with: %s', code);
+               if (code !== 0) {
+                       jd.updateError(jobDetails, 'Render process died 
unexpectedly');
+                       redisClient.hset(
+                               config.get('redis:status_set_name'),
+                               jobDetails.collectionId,
+                               JSON.stringify(jobDetails)
+                       );
+                       getNewItemFromQueue();
+               } else {
+                       // Yay; process finished! mark as such and get new job
+                       console.debug('Render completed successfully!');
+                       jd.updateFinished(jobDetails, renderFile);
+                       redisClient.hset(config.get('redis:status_set_name'), 
jobDetails.collectionId, JSON.stringify(jobDetails));
+
+                       getNewItemFromQueue();
+               }
+       });
+       jd.updateRendering(jobDetails, null, 'Launching renderer', 0);
+       redisClient.hset(config.get('redis:status_set_name'), 
jobDetails.collectionId, JSON.stringify(jobDetails));
+}
+
 exports.init = initBackend;
 exports.start = startBackend;
 exports.stop = stopBackend;

-- 
To view, visit https://gerrit.wikimedia.org/r/96723
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia1b70f1c1418137bae2673fef120ebe233bf8dde
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Collection/OfflineContentGenerator
Gerrit-Branch: master
Gerrit-Owner: Mwalker <mwal...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to