@@ -1235,4 +1235,59 @@ bucket_definitions:
12351235 const checksums2 = [ ...( await bucketStorage . getChecksums ( checkpoint + 1n , [ 'global[]' ] ) ) . values ( ) ] ;
12361236 expect ( checksums2 ) . toEqual ( [ { bucket : 'global[]' , checksum : 1917136889 , count : 1 } ] ) ;
12371237 } ) ;
1238+
1239+ testChecksumBatching ( generateStorageFactory ) ;
1240+ }
1241+
1242+ /**
1243+ * This specifically tests an issue we ran into with MongoDB storage.
1244+ *
1245+ * Exposed as a separate test so we can test with more storage parameters.
1246+ */
1247+ export function testChecksumBatching ( generateStorageFactory : storage . TestStorageFactory ) {
1248+ test ( 'checksums for multiple buckets' , async ( ) => {
1249+ await using factory = await generateStorageFactory ( ) ;
1250+ const syncRules = await factory . updateSyncRules ( {
1251+ content : `
1252+ bucket_definitions:
1253+ user:
1254+ parameters: select request.user_id() as user_id
1255+ data:
1256+ - select id, description from test where user_id = bucket.user_id
1257+ `
1258+ } ) ;
1259+ const bucketStorage = factory . getInstance ( syncRules ) ;
1260+
1261+ const sourceTable = TEST_TABLE ;
1262+ await bucketStorage . startBatch ( test_utils . BATCH_OPTIONS , async ( batch ) => {
1263+ for ( let u of [ 'u1' , 'u2' , 'u3' , 'u4' ] ) {
1264+ for ( let t of [ 't1' , 't2' , 't3' , 't4' ] ) {
1265+ const id = `${ t } _${ u } ` ;
1266+ await batch . save ( {
1267+ sourceTable,
1268+ tag : storage . SaveOperationTag . INSERT ,
1269+ after : {
1270+ id,
1271+ description : `${ t } description` ,
1272+ user_id : u
1273+ } ,
1274+ afterReplicaId : test_utils . rid ( id )
1275+ } ) ;
1276+ }
1277+ }
1278+ await batch . commit ( '1/1' ) ;
1279+ } ) ;
1280+ const { checkpoint } = await bucketStorage . getCheckpoint ( ) ;
1281+
1282+ bucketStorage . clearChecksumCache ( ) ;
1283+ const buckets = [ 'user["u1"]' , 'user["u2"]' , 'user["u3"]' , 'user["u4"]' ] ;
1284+ const checksums = [ ...( await bucketStorage . getChecksums ( checkpoint , buckets ) ) . values ( ) ] ;
1285+ checksums . sort ( ( a , b ) => a . bucket . localeCompare ( b . bucket ) ) ;
1286+ expect ( checksums ) . toEqual ( [
1287+ { bucket : 'user["u1"]' , count : 4 , checksum : 346204588 } ,
1288+ { bucket : 'user["u2"]' , count : 4 , checksum : 5261081 } ,
1289+ { bucket : 'user["u3"]' , count : 4 , checksum : 134760718 } ,
1290+ { bucket : 'user["u4"]' , count : 4 , checksum : - 302639724 }
1291+ ] ) ;
1292+ } ) ;
12381293}
0 commit comments