Parcourir la source

Merge pull request #15382 from overleaf/csh-issue-11625-mongo-ug-5-history-v1

Upgrade mongodb module for history-v1 from 4.11.0 to 6.2.0

GitOrigin-RevId: 2f0a8c07f2797ac23d202858613715b177b41e15
Christopher Hoskin il y a 3 ans
Parent
commit
0ae174a47b

+ 77 - 64
package-lock.json

@@ -38426,7 +38426,7 @@
         "jsonwebtoken": "^9.0.0",
         "jsonwebtoken": "^9.0.0",
         "knex": "^2.4.0",
         "knex": "^2.4.0",
         "lodash": "^4.17.19",
         "lodash": "^4.17.19",
-        "mongodb": "^4.11.0",
+        "mongodb": "^6.2.0",
         "overleaf-editor-core": "*",
         "overleaf-editor-core": "*",
         "pg": "^8.7.1",
         "pg": "^8.7.1",
         "swagger-tools": "^0.10.4",
         "swagger-tools": "^0.10.4",
@@ -38458,37 +38458,11 @@
       }
       }
     },
     },
     "services/history-v1/node_modules/bson": {
     "services/history-v1/node_modules/bson": {
-      "version": "4.7.2",
-      "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
-      "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
-      "dependencies": {
-        "buffer": "^5.6.0"
-      },
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
+      "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==",
       "engines": {
       "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "services/history-v1/node_modules/buffer": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.1.13"
+        "node": ">=16.20.1"
       }
       }
     },
     },
     "services/history-v1/node_modules/check-types": {
     "services/history-v1/node_modules/check-types": {
@@ -38536,21 +38510,63 @@
         "node": ">=10"
         "node": ">=10"
       }
       }
     },
     },
+    "services/history-v1/node_modules/gcp-metadata": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
+      "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
+      "optional": true,
+      "peer": true,
+      "dependencies": {
+        "gaxios": "^5.0.0",
+        "json-bigint": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "services/history-v1/node_modules/mongodb": {
     "services/history-v1/node_modules/mongodb": {
-      "version": "4.17.1",
-      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.1.tgz",
-      "integrity": "sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==",
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz",
+      "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==",
       "dependencies": {
       "dependencies": {
-        "bson": "^4.7.2",
-        "mongodb-connection-string-url": "^2.6.0",
-        "socks": "^2.7.1"
+        "@mongodb-js/saslprep": "^1.1.0",
+        "bson": "^6.2.0",
+        "mongodb-connection-string-url": "^2.6.0"
       },
       },
       "engines": {
       "engines": {
-        "node": ">=12.9.0"
+        "node": ">=16.20.1"
       },
       },
-      "optionalDependencies": {
-        "@aws-sdk/credential-providers": "^3.186.0",
-        "@mongodb-js/saslprep": "^1.1.0"
+      "peerDependencies": {
+        "@aws-sdk/credential-providers": "^3.188.0",
+        "@mongodb-js/zstd": "^1.1.0",
+        "gcp-metadata": "^5.2.0",
+        "kerberos": "^2.0.1",
+        "mongodb-client-encryption": ">=6.0.0 <7",
+        "snappy": "^7.2.2",
+        "socks": "^2.7.1"
+      },
+      "peerDependenciesMeta": {
+        "@aws-sdk/credential-providers": {
+          "optional": true
+        },
+        "@mongodb-js/zstd": {
+          "optional": true
+        },
+        "gcp-metadata": {
+          "optional": true
+        },
+        "kerberos": {
+          "optional": true
+        },
+        "mongodb-client-encryption": {
+          "optional": true
+        },
+        "snappy": {
+          "optional": true
+        },
+        "socks": {
+          "optional": true
+        }
       }
       }
     },
     },
     "services/history-v1/node_modules/test-value": {
     "services/history-v1/node_modules/test-value": {
@@ -65016,7 +65032,7 @@
         "knex": "^2.4.0",
         "knex": "^2.4.0",
         "lodash": "^4.17.19",
         "lodash": "^4.17.19",
         "mocha": "^10.2.0",
         "mocha": "^10.2.0",
-        "mongodb": "^4.11.0",
+        "mongodb": "^6.2.0",
         "node-fetch": "^2.6.7",
         "node-fetch": "^2.6.7",
         "overleaf-editor-core": "*",
         "overleaf-editor-core": "*",
         "pg": "^8.7.1",
         "pg": "^8.7.1",
@@ -65039,21 +65055,9 @@
           }
           }
         },
         },
         "bson": {
         "bson": {
-          "version": "4.7.2",
-          "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
-          "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
-          "requires": {
-            "buffer": "^5.6.0"
-          }
-        },
-        "buffer": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-          "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-          "requires": {
-            "base64-js": "^1.3.1",
-            "ieee754": "^1.1.13"
-          }
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
+          "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q=="
         },
         },
         "check-types": {
         "check-types": {
           "version": "11.1.2",
           "version": "11.1.2",
@@ -65091,16 +65095,25 @@
             "universalify": "^2.0.0"
             "universalify": "^2.0.0"
           }
           }
         },
         },
+        "gcp-metadata": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
+          "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
+          "optional": true,
+          "peer": true,
+          "requires": {
+            "gaxios": "^5.0.0",
+            "json-bigint": "^1.0.0"
+          }
+        },
         "mongodb": {
         "mongodb": {
-          "version": "4.17.1",
-          "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.1.tgz",
-          "integrity": "sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==",
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz",
+          "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==",
           "requires": {
           "requires": {
-            "@aws-sdk/credential-providers": "^3.186.0",
             "@mongodb-js/saslprep": "^1.1.0",
             "@mongodb-js/saslprep": "^1.1.0",
-            "bson": "^4.7.2",
-            "mongodb-connection-string-url": "^2.6.0",
-            "socks": "^2.7.1"
+            "bson": "^6.2.0",
+            "mongodb-connection-string-url": "^2.6.0"
           }
           }
         },
         },
         "test-value": {
         "test-value": {

+ 1 - 1
services/history-v1/package.json

@@ -29,7 +29,7 @@
     "jsonwebtoken": "^9.0.0",
     "jsonwebtoken": "^9.0.0",
     "knex": "^2.4.0",
     "knex": "^2.4.0",
     "lodash": "^4.17.19",
     "lodash": "^4.17.19",
-    "mongodb": "^4.11.0",
+    "mongodb": "^6.2.0",
     "overleaf-editor-core": "*",
     "overleaf-editor-core": "*",
     "pg": "^8.7.1",
     "pg": "^8.7.1",
     "swagger-tools": "^0.10.4",
     "swagger-tools": "^0.10.4",

+ 5 - 5
services/history-v1/storage/lib/blob_store/mongo.js

@@ -29,7 +29,7 @@ async function initialize(projectId) {
   assert.mongoId(projectId, 'bad projectId')
   assert.mongoId(projectId, 'bad projectId')
   try {
   try {
     await mongodb.blobs.insertOne({
     await mongodb.blobs.insertOne({
-      _id: ObjectId(projectId),
+      _id: new ObjectId(projectId),
       blobs: {},
       blobs: {},
     })
     })
   } catch (err) {
   } catch (err) {
@@ -48,7 +48,7 @@ async function findBlob(projectId, hash) {
 
 
   const bucket = getBucket(hash)
   const bucket = getBucket(hash)
   const result = await mongodb.blobs.findOne(
   const result = await mongodb.blobs.findOne(
-    { _id: ObjectId(projectId) },
+    { _id: new ObjectId(projectId) },
     { projection: { _id: 0, bucket: `$${bucket}` } }
     { projection: { _id: 0, bucket: `$${bucket}` } }
   )
   )
 
 
@@ -103,7 +103,7 @@ async function findBlobs(projectId, hashes) {
     projection[bucket] = 1
     projection[bucket] = 1
   }
   }
   const result = await mongodb.blobs.findOne(
   const result = await mongodb.blobs.findOne(
-    { _id: ObjectId(projectId) },
+    { _id: new ObjectId(projectId) },
     { projection }
     { projection }
   )
   )
 
 
@@ -191,7 +191,7 @@ async function insertBlob(projectId, blob) {
   const record = blobToRecord(blob)
   const record = blobToRecord(blob)
   const result = await mongodb.blobs.updateOne(
   const result = await mongodb.blobs.updateOne(
     {
     {
-      _id: ObjectId(projectId),
+      _id: new ObjectId(projectId),
       $expr: {
       $expr: {
         $lt: [{ $size: { $ifNull: [`$${bucket}`, []] } }, MAX_BLOBS_IN_BUCKET],
         $lt: [{ $size: { $ifNull: [`$${bucket}`, []] } }, MAX_BLOBS_IN_BUCKET],
       },
       },
@@ -224,7 +224,7 @@ async function insertRecordSharded(projectId, hash, record) {
  */
  */
 async function deleteBlobs(projectId) {
 async function deleteBlobs(projectId) {
   assert.mongoId(projectId, 'bad projectId')
   assert.mongoId(projectId, 'bad projectId')
-  await mongodb.blobs.deleteOne({ _id: ObjectId(projectId) })
+  await mongodb.blobs.deleteOne({ _id: new ObjectId(projectId) })
   const minShardedId = makeShardedId(projectId, '0')
   const minShardedId = makeShardedId(projectId, '0')
   const maxShardedId = makeShardedId(projectId, 'f')
   const maxShardedId = makeShardedId(projectId, 'f')
   await mongodb.shardedBlobs.deleteMany({
   await mongodb.shardedBlobs.deleteMany({

+ 10 - 10
services/history-v1/storage/lib/chunk_store/mongo.js

@@ -14,7 +14,7 @@ async function getLatestChunk(projectId) {
   assert.mongoId(projectId, 'bad projectId')
   assert.mongoId(projectId, 'bad projectId')
 
 
   const record = await mongodb.chunks.findOne(
   const record = await mongodb.chunks.findOne(
-    { projectId: ObjectId(projectId), state: 'active' },
+    { projectId: new ObjectId(projectId), state: 'active' },
     { sort: { startVersion: -1 } }
     { sort: { startVersion: -1 } }
   )
   )
   if (record == null) {
   if (record == null) {
@@ -32,7 +32,7 @@ async function getChunkForVersion(projectId, version) {
 
 
   const record = await mongodb.chunks.findOne(
   const record = await mongodb.chunks.findOne(
     {
     {
-      projectId: ObjectId(projectId),
+      projectId: new ObjectId(projectId),
       state: 'active',
       state: 'active',
       startVersion: { $lte: version },
       startVersion: { $lte: version },
       endVersion: { $gte: version },
       endVersion: { $gte: version },
@@ -55,7 +55,7 @@ async function getChunkForTimestamp(projectId, timestamp) {
 
 
   const record = await mongodb.chunks.findOne(
   const record = await mongodb.chunks.findOne(
     {
     {
-      projectId: ObjectId(projectId),
+      projectId: new ObjectId(projectId),
       state: 'active',
       state: 'active',
       endTimestamp: { $gte: timestamp },
       endTimestamp: { $gte: timestamp },
     },
     },
@@ -84,7 +84,7 @@ async function getProjectChunkIds(projectId) {
   assert.mongoId(projectId, 'bad projectId')
   assert.mongoId(projectId, 'bad projectId')
 
 
   const cursor = mongodb.chunks.find(
   const cursor = mongodb.chunks.find(
-    { projectId: ObjectId(projectId), state: 'active' },
+    { projectId: new ObjectId(projectId), state: 'active' },
     { projection: { _id: 1 } }
     { projection: { _id: 1 } }
   )
   )
   return await cursor.map(record => record._id).toArray()
   return await cursor.map(record => record._id).toArray()
@@ -100,7 +100,7 @@ async function insertPendingChunk(projectId, chunk) {
   const chunkId = new ObjectId()
   const chunkId = new ObjectId()
   await mongodb.chunks.insertOne({
   await mongodb.chunks.insertOne({
     _id: chunkId,
     _id: chunkId,
-    projectId: ObjectId(projectId),
+    projectId: new ObjectId(projectId),
     startVersion: chunk.getStartVersion(),
     startVersion: chunk.getStartVersion(),
     endVersion: chunk.getEndVersion(),
     endVersion: chunk.getEndVersion(),
     endTimestamp: chunk.getEndTimestamp(),
     endTimestamp: chunk.getEndTimestamp(),
@@ -122,8 +122,8 @@ async function confirmCreate(projectId, chunk, chunkId, mongoOpts = {}) {
   try {
   try {
     result = await mongodb.chunks.updateOne(
     result = await mongodb.chunks.updateOne(
       {
       {
-        _id: ObjectId(chunkId),
-        projectId: ObjectId(projectId),
+        _id: new ObjectId(chunkId),
+        projectId: new ObjectId(projectId),
         state: 'pending',
         state: 'pending',
       },
       },
       { $set: { state: 'active', updatedAt: new Date() } },
       { $set: { state: 'active', updatedAt: new Date() } },
@@ -176,7 +176,7 @@ async function deleteChunk(projectId, chunkId, mongoOpts = {}) {
   assert.mongoId(chunkId, 'bad chunkId')
   assert.mongoId(chunkId, 'bad chunkId')
 
 
   await mongodb.chunks.updateOne(
   await mongodb.chunks.updateOne(
-    { _id: ObjectId(chunkId), projectId: ObjectId(projectId) },
+    { _id: new ObjectId(chunkId), projectId: new ObjectId(projectId) },
     { $set: { state: 'deleted', updatedAt: new Date() } },
     { $set: { state: 'deleted', updatedAt: new Date() } },
     mongoOpts
     mongoOpts
   )
   )
@@ -189,7 +189,7 @@ async function deleteProjectChunks(projectId) {
   assert.mongoId(projectId, 'bad projectId')
   assert.mongoId(projectId, 'bad projectId')
 
 
   await mongodb.chunks.updateMany(
   await mongodb.chunks.updateMany(
-    { projectId: ObjectId(projectId), state: 'active' },
+    { projectId: new ObjectId(projectId), state: 'active' },
     { $set: { state: 'deleted', updatedAt: new Date() } }
     { $set: { state: 'deleted', updatedAt: new Date() } }
   )
   )
 }
 }
@@ -239,7 +239,7 @@ async function getOldChunksBatch(count, minAgeSecs) {
  */
  */
 async function deleteOldChunks(chunkIds) {
 async function deleteOldChunks(chunkIds) {
   await mongodb.chunks.deleteMany({
   await mongodb.chunks.deleteMany({
-    _id: { $in: chunkIds.map(ObjectId) },
+    _id: { $in: chunkIds.map(id => new ObjectId(id)) },
     state: { $in: ['deleted', 'pending'] },
     state: { $in: ['deleted', 'pending'] },
   })
   })
 }
 }

+ 3 - 3
services/history-v1/test/acceptance/js/storage/blob_store_mongo.test.js

@@ -6,7 +6,7 @@ const mongoBackend = require('../../../../storage/lib/blob_store/mongo')
 const mongodb = require('../../../../storage/lib/mongodb')
 const mongodb = require('../../../../storage/lib/mongodb')
 
 
 describe('BlobStore Mongo backend', function () {
 describe('BlobStore Mongo backend', function () {
-  const projectId = ObjectId().toString()
+  const projectId = new ObjectId().toString()
   const hashes = {
   const hashes = {
     abcd: [
     abcd: [
       'abcd000000000000000000000000000000000000',
       'abcd000000000000000000000000000000000000',
@@ -38,7 +38,7 @@ describe('BlobStore Mongo backend', function () {
         const blob = new Blob(hash, 123, 99)
         const blob = new Blob(hash, 123, 99)
         await mongoBackend.insertBlob(projectId, blob)
         await mongoBackend.insertBlob(projectId, blob)
       }
       }
-      const record = await mongodb.blobs.findOne(ObjectId(projectId), {
+      const record = await mongodb.blobs.findOne(new ObjectId(projectId), {
         promoteBuffers: true,
         promoteBuffers: true,
       })
       })
       expect(record.blobs).to.deep.equal({
       expect(record.blobs).to.deep.equal({
@@ -56,7 +56,7 @@ describe('BlobStore Mongo backend', function () {
         const blob = new Blob(hash, 123, 99)
         const blob = new Blob(hash, 123, 99)
         await mongoBackend.insertBlob(projectId, blob)
         await mongoBackend.insertBlob(projectId, blob)
       }
       }
-      const record = await mongodb.blobs.findOne(ObjectId(projectId), {
+      const record = await mongodb.blobs.findOne(new ObjectId(projectId), {
         promoteBuffers: true,
         promoteBuffers: true,
       })
       })
       expect(record.blobs).to.deep.equal({
       expect(record.blobs).to.deep.equal({

+ 1 - 1
services/history-v1/test/acceptance/js/storage/chunk_store_mongo_backend.test.js

@@ -9,7 +9,7 @@ describe('chunk store Mongo backend', function () {
 
 
   describe('garbage collection', function () {
   describe('garbage collection', function () {
     it('deletes pending and deleted chunks', async function () {
     it('deletes pending and deleted chunks', async function () {
-      const projectId = ObjectId().toString()
+      const projectId = new ObjectId().toString()
 
 
       // Create a pending chunk
       // Create a pending chunk
       const pendingChunk = makeChunk([], 0)
       const pendingChunk = makeChunk([], 0)

+ 3 - 3
services/history-v1/test/acceptance/js/storage/tasks.test.js

@@ -14,7 +14,7 @@ const cleanup = require('./support/cleanup')
 
 
 const CHUNK_STORE_BUCKET = config.get('chunkStore.bucket')
 const CHUNK_STORE_BUCKET = config.get('chunkStore.bucket')
 const postgresProjectId = 1
 const postgresProjectId = 1
-const mongoProjectId = ObjectId('abcdefabcdefabcdefabcdef')
+const mongoProjectId = new ObjectId('abcdefabcdefabcdefabcdef')
 
 
 describe('tasks', function () {
 describe('tasks', function () {
   beforeEach(cleanup.everything)
   beforeEach(cleanup.everything)
@@ -42,7 +42,7 @@ describe('tasks', function () {
         deleted_at: deletedAt,
         deleted_at: deletedAt,
       })
       })
       mongoChunks.push({
       mongoChunks.push({
-        _id: ObjectId(i.toString().padStart(24, '0')),
+        _id: new ObjectId(i.toString().padStart(24, '0')),
         projectId: mongoProjectId,
         projectId: mongoProjectId,
         startVersion,
         startVersion,
         endVersion,
         endVersion,
@@ -63,7 +63,7 @@ describe('tasks', function () {
         deleted_at: deletedAt,
         deleted_at: deletedAt,
       })
       })
       mongoChunks.push({
       mongoChunks.push({
-        _id: ObjectId(i.toString().padStart(24, '0')),
+        _id: new ObjectId(i.toString().padStart(24, '0')),
         projectId: mongoProjectId,
         projectId: mongoProjectId,
         startVersion,
         startVersion,
         endVersion,
         endVersion,