migrate_history.js 3.3 KB

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