Skip to content

Commit bf40276

Browse files
authored
fixed query hanging after local document inserted (#7349)
1 parent bcb0568 commit bf40276

2 files changed

Lines changed: 30 additions & 1 deletion

File tree

src/plugins/pipeline/rx-pipeline.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ export class RxPipeline<RxDocType> {
7676
this.source.onClose.push(() => this.close());
7777
this.destination.awaitBeforeReads.add(this.waitBeforeWriteFn);
7878
this.subs.push(
79-
this.source.eventBulks$.subscribe((bulk) => {
79+
this.source.eventBulks$.pipe(
80+
filter(bulk => !this.stopped && !bulk.isLocal)
81+
).subscribe((bulk) => {
8082
this.lastSourceDocTime.next(bulk.events[0].documentData._meta.lwt);
8183
this.somethingChanged.next({});
8284
})

test/unit/rx-pipeline.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ import {
1717
} from '../../plugins/test-utils/index.mjs';
1818
import { wrappedValidateAjvStorage } from '../../plugins/validate-ajv/index.mjs';
1919
import { RxDBPipelinePlugin } from '../../plugins/pipeline/index.mjs';
20+
import { RxDBLocalDocumentsPlugin } from '../../plugins/local-documents/index.mjs';
2021
addRxPlugin(RxDBPipelinePlugin);
22+
addRxPlugin(RxDBLocalDocumentsPlugin);
2123
import { RxDBLeaderElectionPlugin } from '../../plugins/leader-election/index.mjs';
2224
import { assertThrows } from 'async-test-util';
2325
addRxPlugin(RxDBLeaderElectionPlugin);
@@ -392,6 +394,31 @@ describe('rx-pipeline.test.js', () => {
392394
assert.strictEqual(c2After.firstName, 'foobar');
393395

394396

397+
c1.database.close();
398+
c2.database.close();
399+
});
400+
it('should not block reads when localDocument inserted', async () => {
401+
const c1 = await humansCollection.create(0);
402+
await c1.database.waitForLeadership();
403+
const c2 = await humansCollection.create(0);
404+
405+
await c1.addPipeline({
406+
destination: c2,
407+
handler: async (docs) => {
408+
for (const doc of docs) {
409+
await c2.insert(schemaObjects.humanData(doc.passportId));
410+
}
411+
},
412+
identifier: randomToken(10)
413+
});
414+
await c1.insert(schemaObjects.humanData('foobar'));
415+
const doc2 = await c2.findOne().exec(true);
416+
assert.strictEqual(doc2.passportId, 'foobar');
417+
418+
await c1.insertLocal('LOCAL_KEY', { data: true });
419+
const doc2AfterLocalInserted = await c2.findOne().exec(true);
420+
assert.strictEqual(doc2AfterLocalInserted.passportId, 'foobar');
421+
395422
c1.database.close();
396423
c2.database.close();
397424
});

0 commit comments

Comments
 (0)