ClsiCacheManager.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. const { NotFoundError } = require('../Errors/Errors')
  2. const ClsiCacheHandler = require('./ClsiCacheHandler')
  3. const DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler')
  4. const ProjectGetter = require('../Project/ProjectGetter')
  5. const SplitTestHandler = require('../SplitTests/SplitTestHandler')
  6. async function getLatestBuildFromCache(projectId, userId, filename, signal) {
  7. const [
  8. { location, lastModified: lastCompiled, zone, size, allFiles },
  9. lastUpdatedInRedis,
  10. { lastUpdated: lastUpdatedInMongo, name: projectName },
  11. ] = await Promise.all([
  12. ClsiCacheHandler.getLatestOutputFile(projectId, userId, filename, signal),
  13. DocumentUpdaterHandler.promises.getProjectLastUpdatedAt(projectId),
  14. ProjectGetter.promises.getProject(projectId, { lastUpdated: 1, name: 1 }),
  15. ])
  16. const lastUpdated =
  17. lastUpdatedInRedis > lastUpdatedInMongo
  18. ? lastUpdatedInRedis
  19. : lastUpdatedInMongo
  20. const isUpToDate = lastCompiled >= lastUpdated
  21. return {
  22. internal: {
  23. location,
  24. zone,
  25. projectName,
  26. },
  27. external: {
  28. isUpToDate,
  29. lastUpdated,
  30. size,
  31. allFiles,
  32. },
  33. }
  34. }
  35. async function prepareClsiCache(
  36. projectId,
  37. userId,
  38. { sourceProjectId, templateId, templateVersionId }
  39. ) {
  40. const { variant } = await SplitTestHandler.promises.getAssignmentForUser(
  41. userId,
  42. 'copy-clsi-cache'
  43. )
  44. if (variant !== 'enabled') return
  45. const signal = AbortSignal.timeout(5_000)
  46. let lastUpdated
  47. let zone = 'b' // populate template data on zone b
  48. if (sourceProjectId) {
  49. try {
  50. ;({
  51. internal: { zone },
  52. external: { lastUpdated },
  53. } = await getLatestBuildFromCache(
  54. sourceProjectId,
  55. userId,
  56. 'output.tar.gz',
  57. signal
  58. ))
  59. } catch (err) {
  60. if (err instanceof NotFoundError) return // nothing cached yet
  61. throw err
  62. }
  63. }
  64. try {
  65. await ClsiCacheHandler.prepareCacheSource(projectId, userId, {
  66. sourceProjectId,
  67. templateId,
  68. templateVersionId,
  69. zone,
  70. lastUpdated,
  71. signal,
  72. })
  73. } catch (err) {
  74. if (err instanceof NotFoundError) return // nothing cached yet/expired.
  75. throw err
  76. }
  77. }
  78. module.exports = {
  79. getLatestBuildFromCache,
  80. prepareClsiCache,
  81. }