improve logging and interrupt handling

This commit is contained in:
Brian Gough 2016-02-04 16:31:38 +00:00
parent a179b74ae6
commit f764f77b30

View file

@ -3,7 +3,7 @@ fs = require("fs")
mongojs = require("mongojs")
ObjectId = mongojs.ObjectId
db = mongojs(Settings.mongo.url, ['docs','docHistory', 'docHistoryStats'])
_ = require("lodash")
_ = require("underscore")
async = require("async")
exec = require("child_process").exec
BSON = db.bson.BSON
@ -13,6 +13,14 @@ logger = {
err: ->
}
needToExit = false
handleExit = () ->
needToExit = true
console.log('Got signal. Shutting down.')
process.on 'SIGINT', handleExit
process.on 'SIGHUP', handleExit
finished_docs_path = "/tmp/finished-docs-3"
all_docs_path = "/tmp/all-docs-3"
unmigrated_docs_path = "/tmp/unmigrated-docs-3"
@ -56,23 +64,24 @@ markDocAsUnmigrated = (doc_id, callback)->
markDocAsProcessed doc_id, (err)->
fs.appendFile unmigrated_docs_path, "#{doc_id}\n", callback
printProgress = ->
count = Object.keys(finished_docs).length
console.log "completed", count
checkIfDocHasBeenProccessed = (doc_id, callback)->
callback(null, finished_docs[doc_id])
processNext = (doc_id, callback)->
if !doc_id? or doc_id.length == 0
return callback()
if needToExit
return callback(new Error("graceful shutdown"))
checkIfDocHasBeenProccessed doc_id, (err, hasBeenProcessed)->
if hasBeenProcessed
console.log "#{doc_id} already processed, skipping"
return callback()
console.log "#{doc_id} processing"
PackManager._packDocHistory doc_id, {}, (err) ->
markDocAsProcessed doc_id, callback
if err?
console.log "error processing #{doc_id}"
markDocAsUnmigrated doc_id, callback
else
markDocAsProcessed doc_id, callback
updateIndexes = (callback) ->
async.series [
@ -91,15 +100,27 @@ updateIndexes = (callback) ->
exports.migrate = (client, done = ->)->
getDocIds (err, ids)->
totalDocCount = ids.length
alreadyFinishedCount = Object.keys(finished_docs).length
t0 = Date.now()
printProgress = () ->
count = Object.keys(finished_docs).length
processedFraction = (count-alreadyFinishedCount)/totalDocCount
remainingFraction = (totalDocCount-count)/totalDocCount
t = Date.now()
dt = (t-t0)*remainingFraction/processedFraction
estFinishTime = new Date(t + dt)
console.log "completed #{count}/#{totalDocCount} processed=#{processedFraction.toFixed(2)} remaining=#{remainingFraction.toFixed(2)} elapsed=#{(t-t0)/1000} est Finish=#{estFinishTime}"
interval = setInterval printProgress, 3*1000
jobs = _.map ids, (id)->
jobs = _.map _.filter(ids, (id) -> not finished_docs[id]), (id)->
return (cb)->
processNext(id, cb)
async.series jobs, (err)->
if err?
console.error err, "at end of jobs"
else
console.log "finished"
console.log "finished at #{new Date}"
clearInterval interval
done(err)