flush_all.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/usr/bin/env node
  2. // To run in dev:
  3. //
  4. // docker compose run --rm project-history scripts/flush_all.js <limit>
  5. //
  6. // In production:
  7. //
  8. // docker run --rm $(docker ps -lq) scripts/flush_all.js <limit>
  9. import _ from 'lodash'
  10. import async from 'async'
  11. import logger from '@overleaf/logger'
  12. import * as RedisManager from '../app/js/RedisManager.js'
  13. import * as UpdatesProcessor from '../app/js/UpdatesProcessor.js'
  14. logger.logger.level('fatal')
  15. const argv = process.argv.slice(2)
  16. const limit = parseInt(argv[0], 10) || null
  17. const parallelism = Math.min(parseInt(argv[1], 10) || 1, 10)
  18. // flush all outstanding changes
  19. RedisManager.getProjectIdsWithHistoryOps(limit, flushProjects)
  20. function flushProjects(error, projectIds) {
  21. if (error) {
  22. throw error
  23. }
  24. let ts = new Date()
  25. console.log(
  26. 'found projects',
  27. JSON.stringify({ project_ids: projectIds.length, limit, ts })
  28. )
  29. projectIds = _.shuffle(projectIds) // randomise to avoid hitting same projects each time
  30. if (limit > 0) {
  31. projectIds = projectIds.slice(0, limit)
  32. }
  33. let succeededProjects = 0
  34. let failedProjects = 0
  35. let attempts = 0
  36. async.eachLimit(
  37. projectIds,
  38. parallelism,
  39. function (projectId, cb) {
  40. attempts++
  41. UpdatesProcessor.processUpdatesForProject(
  42. projectId,
  43. function (err, queueSize) {
  44. const progress = attempts + '/' + projectIds.length
  45. ts = new Date()
  46. if (err) {
  47. failedProjects++
  48. console.log(
  49. 'failed',
  50. progress,
  51. JSON.stringify({
  52. projectId,
  53. queueSize,
  54. ts,
  55. err: err.toString(),
  56. })
  57. )
  58. } else {
  59. succeededProjects++
  60. console.log(
  61. 'succeeded',
  62. progress,
  63. JSON.stringify({
  64. projectId,
  65. queueSize,
  66. ts,
  67. })
  68. )
  69. }
  70. return cb()
  71. }
  72. )
  73. },
  74. function () {
  75. console.log(
  76. 'total',
  77. JSON.stringify({
  78. succeededProjects,
  79. failedProjects,
  80. })
  81. )
  82. process.exit(0)
  83. }
  84. )
  85. }