migrate_history.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // raise mongo timeout to 1hr if otherwise unspecified
  2. process.env.MONGO_SOCKET_TIMEOUT =
  3. parseInt(process.env.MONGO_SOCKET_TIMEOUT, 10) || 3600000
  4. const {
  5. countProjects,
  6. countDocHistory,
  7. upgradeProject,
  8. } = require('../../modules/history-migration/app/src/HistoryUpgradeHelper')
  9. const { waitForDb } = require('../../app/src/infrastructure/mongodb')
  10. const minimist = require('minimist')
  11. const argv = minimist(process.argv.slice(2), {
  12. boolean: [
  13. 'verbose',
  14. 'dry-run',
  15. 'use-query-hint',
  16. 'retry-failed',
  17. 'archive-on-failure',
  18. ],
  19. alias: {
  20. verbose: 'v',
  21. 'dry-run': 'd',
  22. 'use-query-hint': 'q',
  23. 'retry-failed': 'r',
  24. 'archive-on-failure': 'a',
  25. },
  26. default: {
  27. 'write-concurrency': 10,
  28. 'batch-size': 100,
  29. 'max-upgrades-to-attempt': false,
  30. 'max-failures': 50,
  31. },
  32. })
  33. async function findProjectsToMigrate() {
  34. console.log('History Migration Statistics')
  35. // Show statistics about the number of projects to migrate
  36. const migratedProjects = await countProjects({
  37. 'overleaf.history.display': true,
  38. })
  39. const totalProjects = await countProjects()
  40. console.log('Migrated Projects : ', migratedProjects)
  41. console.log('Total Projects : ', totalProjects)
  42. console.log('Remaining Projects : ', totalProjects - migratedProjects)
  43. if (migratedProjects === totalProjects) {
  44. console.log('All projects have been migrated')
  45. process.exit(0)
  46. }
  47. // Get a list of projects to migrate
  48. const projectsToMigrate = findProjectsToMigrate(
  49. { 'overleaf.history.display': { $ne: true } },
  50. { _id: 1, overleaf: 1 }
  51. )
  52. // Show statistics for docHistory collection
  53. const docHistoryWithoutProjectId = await countDocHistory({
  54. project_id: { $exists: false },
  55. })
  56. if (docHistoryWithoutProjectId > 0) {
  57. console.log(
  58. `WARNING: docHistory collection contains ${docHistoryWithoutProjectId} records without project_id`
  59. )
  60. process.exit(1)
  61. }
  62. // Find the total number of history records for the projects we need to migrate
  63. let docHistoryCount = 0
  64. for await (const project of projectsToMigrate) {
  65. const count = await countDocHistory({ project_id: project._id })
  66. docHistoryCount += count
  67. }
  68. console.log('Total history records to migrate:', docHistoryCount)
  69. return projectsToMigrate
  70. }
  71. async function migrateProjects(projectsToMigrate) {
  72. let projectsMigrated = 0
  73. let projectsFailed = 0
  74. console.log('Starting migration...')
  75. for (const project of projectsToMigrate) {
  76. console.log(`Migrating project: ${project._id}`)
  77. try {
  78. const result = await upgradeProject(project._id)
  79. console.log(`migration result: ${JSON.stringify(result)}`)
  80. projectsMigrated++
  81. } catch (err) {
  82. projectsFailed++
  83. console.error(err)
  84. }
  85. }
  86. console.log('Migration complete')
  87. console.log('==================')
  88. console.log('Projects migrated: ', projectsMigrated)
  89. console.log('Projects failed: ', projectsFailed)
  90. }
  91. async function main() {
  92. const projectsToMigrate = await findProjectsToMigrate()
  93. if (argv['dry-run']) {
  94. console.log('Dry run, exiting')
  95. process.exit(0)
  96. }
  97. await migrateProjects(projectsToMigrate)
  98. }
  99. waitForDb()
  100. .then(main)
  101. .catch(err => {
  102. console.error(err)
  103. process.exit(1)
  104. })