pack.coffee 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. mongojs = require "mongojs"
  2. async = require "async"
  3. db = mongojs.connect("localhost/sharelatex", ["docHistory"])
  4. BSON=db.bson.BSON
  5. util = require 'util'
  6. _ = require 'underscore'
  7. MAX_SIZE = 1024*1024
  8. MAX_COUNT = 1024
  9. packOps = (doc_id, callback) ->
  10. console.log 'packing', doc_id
  11. db.docHistory.find({doc_id:mongojs.ObjectId(doc_id),pack:{$exists:false}}).sort {v:1}, (err, docs) ->
  12. packs = []
  13. top = null
  14. if docs.length < 100
  15. console.log 'only', docs.length, 'ops, skipping'
  16. return
  17. docs.forEach (d,i) ->
  18. sz = BSON.calculateObjectSize(d)
  19. if top? && top.pack.length < MAX_COUNT && top.sz + sz < MAX_SIZE
  20. top.pack = top.pack.concat {v: d.v, meta: d.meta, op: d.op, _id: d._id}
  21. top.sz += sz
  22. top.v_end = d.v
  23. top.meta.end_ts = d.meta.end_ts
  24. return
  25. else
  26. # create a new pack
  27. top = _.clone(d)
  28. top.pack = [ {v: d.v, meta: d.meta, op: d.op, _id: d._id} ]
  29. top.meta = { start_ts: d.meta.start_ts, end_ts: d.meta.end_ts }
  30. top.sz = sz
  31. delete top.op
  32. delete top._id
  33. packs.push top
  34. # never store the last pack, keep some unpacked ops
  35. packs.pop()
  36. #
  37. if packs.length > docs.length
  38. console.log 'not enough compression', packs.length, 'vs', docs.length, 'skipping'
  39. return
  40. console.log 'docs', docs.length, 'packs', packs.length
  41. tasks = []
  42. for pack, i in packs
  43. console.log 'storing pack', i
  44. do (pack) ->
  45. task = (cb) ->
  46. bulk = db.docHistory.initializeOrderedBulkOp();
  47. console.log 'insert', pack
  48. bulk.insert pack
  49. pack.pack.forEach (op) ->
  50. console.log 'will remove', op._id
  51. bulk.find({_id:op._id}).removeOne()
  52. bulk.execute (err, result) ->
  53. console.log 'ok?', result.ok, 'nInserted', result.nInserted, 'nRemoved', result.nRemoved
  54. cb(err, result)
  55. tasks.push task
  56. async.series tasks, (err, result) ->
  57. console.log 'writing packs', err, result.length
  58. callback err, result
  59. packOpsTask = (doc_id) ->
  60. return (callback) ->
  61. packOps doc_id, callback
  62. tasks = (packOpsTask id for id in process.argv.slice(2))
  63. async.series tasks, (err, results) ->
  64. console.log 'closing db'
  65. #console.log util.inspect(results,{depth:null})
  66. db.close()