6
6
/** @lends module:api/utils/taskmanager */
7
7
var taskmanager = { } ;
8
8
var common = require ( "./common.js" ) ;
9
+ var countlyFs = require ( "./countlyFs.js" ) ;
9
10
var crypto = require ( "crypto" ) ;
10
11
var request = require ( "request" ) ;
11
12
const log = require ( './log.js' ) ( 'core:taskmanager' ) ;
@@ -227,6 +228,13 @@ taskmanager.createTask = function(options, callback) {
227
228
*/
228
229
taskmanager . saveResult = function ( options , data , callback ) {
229
230
options . db = options . db || common . db ;
231
+ var update = {
232
+ end : new Date ( ) . getTime ( ) ,
233
+ status : "completed" ,
234
+ hasData : true ,
235
+ data : JSON . stringify ( data || { } ) ,
236
+ } ;
237
+
230
238
if ( options . errored ) {
231
239
var message = "" ;
232
240
if ( options . errormsg ) {
@@ -235,56 +243,43 @@ taskmanager.saveResult = function(options, data, callback) {
235
243
if ( message . message ) {
236
244
message = message . message ;
237
245
}
246
+ update . status = "errored" ;
247
+ update . errormsg = message ;
248
+ }
238
249
250
+ options . db . collection ( "long_tasks" ) . findOne ( { _id : options . id } , function ( error , task ) {
239
251
options . db . collection ( "long_tasks" ) . update ( { _id : options . id } , {
240
- $set : {
241
- end : new Date ( ) . getTime ( ) ,
242
- status : "errored" ,
243
- hasData : true ,
244
- data : JSON . stringify ( data || { } ) ,
245
- errormsg : message
246
- }
252
+ $set : update
247
253
} , { 'upsert' : false } , function ( err , res ) {
248
254
if ( options . subtask && ! err ) {
249
255
var updateObj = { $set : { } } ;
250
- updateObj . $set [ "subtasks." + options . id + ".status" ] = "errored" ;
256
+ updateObj . $set [ "subtasks." + options . id + ".status" ] = options . errored ? "errored" : "completed ";
251
257
updateObj . $set [ "subtasks." + options . id + ".hasData" ] = true ;
252
258
updateObj . $set [ "subtasks." + options . id + ".end" ] = new Date ( ) . getTime ( ) ;
253
259
254
- options . db . collection ( "long_tasks" ) . update ( { _id : options . subtask } , updateObj , { 'upsert' : false } , callback ) ;
255
- }
256
- else {
257
- if ( callback ) {
258
- callback ( err , res ) ;
259
- }
260
- }
261
- } ) ;
262
- }
263
- else {
264
- options . db . collection ( "long_tasks" ) . update ( { _id : options . id } , {
265
- $set : {
266
- end : new Date ( ) . getTime ( ) ,
267
- status : "completed" ,
268
- hasData : true ,
269
- data : JSON . stringify ( data || { } )
260
+ options . db . collection ( "long_tasks" ) . update ( { _id : options . subtask } , updateObj , { 'upsert' : false } , function ( ) { } ) ;
270
261
}
271
- } , { 'upsert' : false } , function ( err , res ) {
272
- if ( options . subtask && ! err ) {
273
- var updateObj = { $set : { } } ;
274
- updateObj . $set [ "subtasks." + options . id + ".status" ] = "completed" ;
275
- updateObj . $set [ "subtasks." + options . id + ".hasData" ] = true ;
276
- updateObj . $set [ "subtasks." + options . id + ".end" ] = new Date ( ) . getTime ( ) ;
277
- options . db . collection ( "long_tasks" ) . update ( { _id : options . subtask } , updateObj , { 'upsert' : false } , callback ) ;
262
+
263
+ //document too large for update or it was already previous stored in gridfs
264
+ if ( ( err && err . code === 17419 ) || ( task && task . gridfs ) ) {
265
+ //let's store it in gridfs
266
+ update . data = { } ;
267
+ update . gridfs = true ;
268
+ options . db . collection ( "long_tasks" ) . update ( { _id : options . id } , { $set : update } , function ( ) {
269
+ countlyFs . gridfs . saveData ( "task_results" , options . id , JSON . stringify ( data || { } ) , { id : options . id } , function ( err2 , res2 ) {
270
+ if ( callback ) {
271
+ callback ( err2 , res2 ) ;
272
+ }
273
+ } ) ;
274
+ } ) ;
278
275
}
279
276
else {
280
277
if ( callback ) {
281
278
callback ( err , res ) ;
282
279
}
283
280
}
284
281
} ) ;
285
-
286
-
287
- }
282
+ } ) ;
288
283
} ;
289
284
290
285
/**
@@ -310,19 +305,19 @@ taskmanager.nameResult = function(options, data, callback) {
310
305
*/
311
306
taskmanager . getResult = function ( options , callback ) {
312
307
options . db = options . db || common . db ;
313
- options . db . collection ( "long_tasks" ) . findOne ( { _id : options . id } , callback ) ;
308
+ options . db . collection ( "long_tasks" ) . findOne ( { _id : options . id } , getResult ( callback ) ) ;
314
309
} ;
315
310
316
311
/**
317
312
* Get specific task result
318
313
* @param {object } options - options for the task
319
314
* @param {object } options.db - database connection
320
- * @param {string } options.id - id of the task result
315
+ * @param {string } options.query - query for the task result
321
316
* @param {funciton } callback - callback for the result
322
317
*/
323
318
taskmanager . getResultByQuery = function ( options , callback ) {
324
319
options . db = options . db || common . db ;
325
- options . db . collection ( "long_tasks" ) . findOne ( options . query , callback ) ;
320
+ options . db . collection ( "long_tasks" ) . findOne ( options . query , getResult ( callback ) ) ;
326
321
} ;
327
322
328
323
/**
@@ -531,7 +526,24 @@ taskmanager.getTableQueryResult = async function(options, callback) {
531
526
*/
532
527
taskmanager . deleteResult = function ( options , callback ) {
533
528
options . db = options . db || common . db ;
534
- options . db . collection ( "long_tasks" ) . remove ( { $or : [ { _id : options . id } , { subtask : options . id } ] } , callback ) ;
529
+ options . db . collection ( "long_tasks" ) . findOne ( { _id : options . id } , function ( err , task ) {
530
+ if ( err || ! task ) {
531
+ return callback ( err ) ;
532
+ }
533
+ if ( task . gridfs ) {
534
+ countlyFs . gridfs . deleteFile ( "task_results" , options . id , { id : options . id } , function ( ) { } ) ;
535
+ }
536
+ options . db . collection ( "long_tasks" ) . remove ( { _id : options . id } , callback ) ;
537
+ if ( task . taskgroup ) {
538
+ options . db . collection ( "long_tasks" ) . find ( { subtask : options . id } , { _id : 1 } ) . toArray ( function ( err2 , tasks ) {
539
+ if ( tasks && tasks . length ) {
540
+ for ( var i = 0 ; i < tasks . length ; i ++ ) {
541
+ taskmanager . deleteResult ( { id : tasks [ i ] . _id , db : options . db } , function ( ) { } ) ;
542
+ }
543
+ }
544
+ } ) ;
545
+ }
546
+ } ) ;
535
547
} ;
536
548
537
549
/**
@@ -657,4 +669,33 @@ taskmanager.rerunTask = function(options, callback) {
657
669
}
658
670
} ) ;
659
671
} ;
672
+
673
+ /**
674
+ * Create a callback for getting result, including checking gridfs
675
+ * @param {function } callback - callback for the result
676
+ * @returns {function } callback to use for db query
677
+ */
678
+ function getResult ( callback ) {
679
+ return function ( err , data ) {
680
+ if ( ! err ) {
681
+ if ( data && data . gridfs ) {
682
+ countlyFs . gridfs . getData ( "task_results" , data . _id + "" , { id : data . _id } , function ( err2 , largeData ) {
683
+ if ( ! err2 ) {
684
+ data . data = largeData ;
685
+ callback ( null , data ) ;
686
+ }
687
+ else {
688
+ callback ( err2 , data ) ;
689
+ }
690
+ } ) ;
691
+ }
692
+ else {
693
+ callback ( err , data ) ;
694
+ }
695
+ }
696
+ else {
697
+ callback ( err , data ) ;
698
+ }
699
+ } ;
700
+ }
660
701
module . exports = taskmanager ;
0 commit comments