diff --git a/Firestore/Example/Tests/SpecTests/json/bundle_spec_test.json b/Firestore/Example/Tests/SpecTests/json/bundle_spec_test.json index 94bc9cc0da1..617f5946d5f 100644 --- a/Firestore/Example/Tests/SpecTests/json/bundle_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/bundle_spec_test.json @@ -1166,7 +1166,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ diff --git a/Firestore/Example/Tests/SpecTests/json/existence_filter_spec_test.json b/Firestore/Example/Tests/SpecTests/json/existence_filter_spec_test.json index 24f9d92cf53..131d47cd4a1 100644 --- a/Firestore/Example/Tests/SpecTests/json/existence_filter_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/existence_filter_spec_test.json @@ -179,7 +179,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -593,7 +593,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -792,7 +792,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -3300,7 +3300,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "11": { "queries": [ @@ -3313,7 +3313,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "13": { "queries": [ @@ -3326,7 +3326,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "15": { "queries": [ @@ -3339,7 +3339,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "17": { "queries": [ @@ -3352,7 +3352,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "19": { "queries": [ @@ -3365,7 +3365,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -3390,7 +3390,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "23": { "queries": [ @@ -3403,7 +3403,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "25": { "queries": [ @@ -3416,7 +3416,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "27": { "queries": [ @@ -3429,7 +3429,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "29": { "queries": [ @@ -3442,7 +3442,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "3": { "queries": [ @@ -3455,7 +3455,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "31": { "queries": [ @@ -3468,7 +3468,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "33": { "queries": [ @@ -3481,7 +3481,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "35": { "queries": [ @@ -3494,7 +3494,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "37": { "queries": [ @@ -3507,7 +3507,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "39": { "queries": [ @@ -3520,7 +3520,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "41": { "queries": [ @@ -3533,7 +3533,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "43": { "queries": [ @@ -3546,7 +3546,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "45": { "queries": [ @@ -3559,7 +3559,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "47": { "queries": [ @@ -3572,7 +3572,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "49": { "queries": [ @@ -3585,7 +3585,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "5": { "queries": [ @@ -3598,7 +3598,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "51": { "queries": [ @@ -3611,7 +3611,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "53": { "queries": [ @@ -3624,7 +3624,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "55": { "queries": [ @@ -3637,7 +3637,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "57": { "queries": [ @@ -3650,7 +3650,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "59": { "queries": [ @@ -3663,7 +3663,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "61": { "queries": [ @@ -3676,7 +3676,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "63": { "queries": [ @@ -3689,7 +3689,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "65": { "queries": [ @@ -3702,7 +3702,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "67": { "queries": [ @@ -3715,7 +3715,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "69": { "queries": [ @@ -3728,7 +3728,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "7": { "queries": [ @@ -3741,7 +3741,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "71": { "queries": [ @@ -3754,7 +3754,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "73": { "queries": [ @@ -3767,7 +3767,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "75": { "queries": [ @@ -3780,7 +3780,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "77": { "queries": [ @@ -3793,7 +3793,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "79": { "queries": [ @@ -3806,7 +3806,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "81": { "queries": [ @@ -3819,7 +3819,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "83": { "queries": [ @@ -3832,7 +3832,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "85": { "queries": [ @@ -3845,7 +3845,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "87": { "queries": [ @@ -3858,7 +3858,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "89": { "queries": [ @@ -3871,7 +3871,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "9": { "queries": [ @@ -3884,7 +3884,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "91": { "queries": [ @@ -3897,7 +3897,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "93": { "queries": [ @@ -3910,7 +3910,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "95": { "queries": [ @@ -3923,7 +3923,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "97": { "queries": [ @@ -3936,7 +3936,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "99": { "queries": [ @@ -3949,7 +3949,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -4961,7 +4961,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5536,7 +5536,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5889,7 +5889,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -6427,7 +6427,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -7641,7 +7641,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -7739,7 +7739,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -7769,7 +7769,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ diff --git a/Firestore/Example/Tests/SpecTests/json/limbo_spec_test.json b/Firestore/Example/Tests/SpecTests/json/limbo_spec_test.json index 3958930b2dc..de82951040a 100644 --- a/Firestore/Example/Tests/SpecTests/json/limbo_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/limbo_spec_test.json @@ -235,7 +235,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -281,7 +281,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -406,7 +406,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -489,7 +489,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -572,7 +572,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -675,7 +675,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "10": { "queries": [ @@ -775,7 +775,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "10": { "queries": [ @@ -866,7 +866,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -940,7 +940,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1202,7 +1202,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1248,7 +1248,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1373,7 +1373,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1456,7 +1456,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1539,7 +1539,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1642,7 +1642,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "10": { "queries": [ @@ -1742,7 +1742,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "10": { "queries": [ @@ -2038,7 +2038,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -2123,7 +2123,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -2206,7 +2206,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -2420,7 +2420,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -2834,7 +2834,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -3119,7 +3119,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -3386,7 +3386,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -3633,7 +3633,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -3921,7 +3921,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4037,7 +4037,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4298,7 +4298,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4646,7 +4646,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5025,7 +5025,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5114,7 +5114,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5486,7 +5486,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5511,7 +5511,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -5623,7 +5623,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5648,7 +5648,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -5703,7 +5703,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -5822,7 +5822,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -6255,7 +6255,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -6782,7 +6782,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -7109,7 +7109,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -7193,7 +7193,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -7512,7 +7512,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -7537,7 +7537,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -7646,7 +7646,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "7": { "queries": [ @@ -7659,7 +7659,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -7765,7 +7765,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -8188,7 +8188,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -8213,7 +8213,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -8634,7 +8634,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -8660,7 +8660,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -8767,7 +8767,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9097,7 +9097,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -9122,7 +9122,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9212,7 +9212,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "5": { "queries": [ @@ -9225,7 +9225,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9309,7 +9309,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "7": { "queries": [ @@ -9322,7 +9322,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9405,7 +9405,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "9": { "queries": [ @@ -9418,7 +9418,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9499,7 +9499,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9871,7 +9871,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ diff --git a/Firestore/Example/Tests/SpecTests/json/limit_spec_test.json b/Firestore/Example/Tests/SpecTests/json/limit_spec_test.json index 3b226ee1061..ed2b461ce74 100644 --- a/Firestore/Example/Tests/SpecTests/json/limit_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/limit_spec_test.json @@ -214,7 +214,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4334,7 +4334,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4361,7 +4361,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -4495,7 +4495,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -4520,7 +4520,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -4661,7 +4661,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "7": { "queries": [ @@ -4674,7 +4674,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -4814,7 +4814,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -5304,7 +5304,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -5565,7 +5565,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ diff --git a/Firestore/Example/Tests/SpecTests/json/offline_spec_test.json b/Firestore/Example/Tests/SpecTests/json/offline_spec_test.json index 1d1013681f9..91e4205e441 100644 --- a/Firestore/Example/Tests/SpecTests/json/offline_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/offline_spec_test.json @@ -1150,7 +1150,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -1188,7 +1188,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ diff --git a/Firestore/Example/Tests/SpecTests/json/recovery_spec_test.json b/Firestore/Example/Tests/SpecTests/json/recovery_spec_test.json index bb7306476a3..2e66d63b8d5 100644 --- a/Firestore/Example/Tests/SpecTests/json/recovery_spec_test.json +++ b/Firestore/Example/Tests/SpecTests/json/recovery_spec_test.json @@ -3095,7 +3095,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -3184,7 +3184,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -3569,7 +3569,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -3629,7 +3629,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ diff --git a/Firestore/core/src/core/sync_engine.cc b/Firestore/core/src/core/sync_engine.cc index 6899c236870..1ab3fdc4216 100644 --- a/Firestore/core/src/core/sync_engine.cc +++ b/Firestore/core/src/core/sync_engine.cc @@ -340,7 +340,7 @@ void SyncEngine::HandleRejectedListen(TargetId target_id, Status error) { // copy-initialization" error. DocumentKeySet limbo_documents{limbo_key}; RemoteEvent::TargetChangeMap target_changes; - RemoteEvent::TargetSet target_mismatches; + RemoteEvent::TargetMismatchMap target_mismatches; DocumentUpdateMap document_updates{{limbo_key, doc}}; RemoteEvent event{SnapshotVersion::None(), std::move(target_changes), diff --git a/Firestore/core/src/local/target_data.cc b/Firestore/core/src/local/target_data.cc index d056b41c38a..4512e2f5d89 100644 --- a/Firestore/core/src/local/target_data.cc +++ b/Firestore/core/src/local/target_data.cc @@ -39,6 +39,8 @@ const char* ToString(QueryPurpose purpose) { return "Listen"; case QueryPurpose::ExistenceFilterMismatch: return "ExistenceFilterMismatch"; + case QueryPurpose::ExistenceFilterMismatchBloom: + return "ExistenceFilterMismatchBloom"; case QueryPurpose::LimboResolution: return "LimboResolution"; } diff --git a/Firestore/core/src/local/target_data.h b/Firestore/core/src/local/target_data.h index 5bdb94a423e..5a6a53370e0 100644 --- a/Firestore/core/src/local/target_data.h +++ b/Firestore/core/src/local/target_data.h @@ -41,6 +41,12 @@ enum class QueryPurpose { */ ExistenceFilterMismatch, + /** + * The query was used refill a query if there is an existence filter mismatch + * and the bloom filter application returned a false positive result. + */ + ExistenceFilterMismatchBloom, + /** The query was used to resolve a limbo document. */ LimboResolution, }; diff --git a/Firestore/core/src/remote/remote_event.cc b/Firestore/core/src/remote/remote_event.cc index ca025e30723..82d0e923569 100644 --- a/Firestore/core/src/remote/remote_event.cc +++ b/Firestore/core/src/remote/remote_event.cc @@ -238,27 +238,30 @@ void WatchChangeAggregator::HandleExistenceFilter( } else { int current_size = GetCurrentDocumentCountForTarget(target_id); if (current_size != expected_count) { - // TODO(Mila): Use application status instead of a boolean in next PR. // Apply bloom filter to identify and mark removed documents. - bool bloom_filter_applied = + BloomFilterApplicationStatus status = ApplyBloomFilter(existence_filter, current_size); - if (!bloom_filter_applied) { + if (status != BloomFilterApplicationStatus::kSuccess) { // If bloom filter application fails, we reset the mapping and // trigger re-run of the query. ResetTarget(target_id); - pending_target_resets_.insert(target_id); + const QueryPurpose purpose = + status == BloomFilterApplicationStatus::kFalsePositive + ? QueryPurpose::ExistenceFilterMismatchBloom + : QueryPurpose::ExistenceFilterMismatch; + pending_target_resets_.insert({target_id, purpose}); } } } } } -bool WatchChangeAggregator::ApplyBloomFilter( +BloomFilterApplicationStatus WatchChangeAggregator::ApplyBloomFilter( const ExistenceFilterWatchChange& existence_filter, int current_count) { const absl::optional& bloom_filter_parameters = existence_filter.filter().bloom_filter_parameters(); if (!bloom_filter_parameters.has_value()) { - return false; + return BloomFilterApplicationStatus::kSkipped; } util::StatusOr maybe_bloom_filter = @@ -268,14 +271,23 @@ bool WatchChangeAggregator::ApplyBloomFilter( if (!maybe_bloom_filter.ok()) { LOG_WARN("Creating BloomFilter failed: %s", maybe_bloom_filter.status().error_message()); - return false; + return BloomFilterApplicationStatus::kSkipped; } - int removed_document_count = FilterRemovedDocuments( - maybe_bloom_filter.ValueOrDie(), existence_filter.target_id()); + BloomFilter bloom_filter = std::move(maybe_bloom_filter).ValueOrDie(); + + if (bloom_filter.bit_count() == 0) { + return BloomFilterApplicationStatus::kSkipped; + } + + int removed_document_count = + FilterRemovedDocuments(bloom_filter, existence_filter.target_id()); int expected_count = existence_filter.filter().count(); - return expected_count == (current_count - removed_document_count); + if (expected_count != (current_count - removed_document_count)) { + return BloomFilterApplicationStatus::kFalsePositive; + } + return BloomFilterApplicationStatus::kSuccess; } int WatchChangeAggregator::FilterRemovedDocuments( diff --git a/Firestore/core/src/remote/remote_event.h b/Firestore/core/src/remote/remote_event.h index 308c1f28d8d..0d5331a0d7c 100644 --- a/Firestore/core/src/remote/remote_event.h +++ b/Firestore/core/src/remote/remote_event.h @@ -41,6 +41,8 @@ class TargetData; namespace remote { +enum class BloomFilterApplicationStatus { kSuccess, kSkipped, kFalsePositive }; + /** * Interface implemented by `RemoteStore` to expose target metadata to the * `WatchChangeAggregator`. @@ -246,11 +248,12 @@ class TargetState { class RemoteEvent { public: using TargetChangeMap = std::unordered_map; - using TargetSet = std::unordered_set; + using TargetMismatchMap = + std::unordered_map; RemoteEvent(model::SnapshotVersion snapshot_version, TargetChangeMap target_changes, - TargetSet target_mismatches, + TargetMismatchMap target_mismatches, model::DocumentUpdateMap document_updates, model::DocumentKeySet limbo_document_changes) : snapshot_version_{snapshot_version}, @@ -271,10 +274,11 @@ class RemoteEvent { } /** - * A set of targets that is known to be inconsistent. Listens for these - * targets should be re-established without resume tokens. + * A map of targets that is known to be inconsistent, and the purpose for + * re-listening. Listens for these targets should be re-established without + * resume tokens. */ - const TargetSet& target_mismatches() const { + const TargetMismatchMap& target_mismatches() const { return target_mismatches_; } @@ -296,7 +300,7 @@ class RemoteEvent { private: model::SnapshotVersion snapshot_version_; TargetChangeMap target_changes_; - TargetSet target_mismatches_; + TargetMismatchMap target_mismatches_; model::DocumentUpdateMap document_updates_; model::DocumentKeySet limbo_document_changes_; }; @@ -413,10 +417,12 @@ class WatchChangeAggregator { bool TargetContainsDocument(model::TargetId target_id, const model::DocumentKey& key); - /** Returns whether a bloom filter removed the deleted documents successfully. + /** + * Apply bloom filter to remove the deleted documents, and return the + * application status. */ - bool ApplyBloomFilter(const ExistenceFilterWatchChange& existence_filter, - int current_count); + BloomFilterApplicationStatus ApplyBloomFilter( + const ExistenceFilterWatchChange& existence_filter, int current_count); /** * Filter out removed documents based on bloom filter membership result and @@ -437,11 +443,11 @@ class WatchChangeAggregator { pending_document_target_mappings_; /** - * A list of targets with existence filter mismatches. These targets are known + * A map of targets with existence filter mismatches. These targets are known * to be inconsistent and their listens needs to be re-established by * `RemoteStore`. */ - RemoteEvent::TargetSet pending_target_resets_; + RemoteEvent::TargetMismatchMap pending_target_resets_; TargetMetadataProvider* target_metadata_provider_ = nullptr; }; diff --git a/Firestore/core/src/remote/remote_store.cc b/Firestore/core/src/remote/remote_store.cc index 9f1b409ff6d..25944595549 100644 --- a/Firestore/core/src/remote/remote_store.cc +++ b/Firestore/core/src/remote/remote_store.cc @@ -327,7 +327,10 @@ void RemoteStore::RaiseWatchSnapshot(const SnapshotVersion& snapshot_version) { // Re-establish listens for the targets that have been invalidated by // existence filter mismatches. - for (TargetId target_id : remote_event.target_mismatches()) { + for (const auto& entry : remote_event.target_mismatches()) { + const TargetId& target_id = entry.first; + const QueryPurpose& purpose = entry.second; + auto found = listen_targets_.find(target_id); if (found == listen_targets_.end()) { // A watched target might have been removed already. @@ -351,8 +354,7 @@ void RemoteStore::RaiseWatchSnapshot(const SnapshotVersion& snapshot_version) { // that we flag the first re-listen this way without impacting future // listens of this target (that might happen e.g. on reconnect). TargetData request_target_data(target_data.target(), target_id, - target_data.sequence_number(), - QueryPurpose::ExistenceFilterMismatch); + target_data.sequence_number(), purpose); SendWatchRequest(request_target_data); } diff --git a/Firestore/core/src/remote/serializer.cc b/Firestore/core/src/remote/serializer.cc index 5a57403f3a8..9c9a4cbae7e 100644 --- a/Firestore/core/src/remote/serializer.cc +++ b/Firestore/core/src/remote/serializer.cc @@ -1290,6 +1290,8 @@ std::string Serializer::EncodeLabel(QueryPurpose purpose) const { return ""; case QueryPurpose::ExistenceFilterMismatch: return "existence-filter-mismatch"; + case QueryPurpose::ExistenceFilterMismatchBloom: + return "existence-filter-mismatch-bloom"; case QueryPurpose::LimboResolution: return "limbo-document"; }