Skip to content

Commit 32c8722

Browse files
committed
On peer connection, send a persistent ping to ensure missing patch detection is enforced.
1 parent 2443b35 commit 32c8722

4 files changed

Lines changed: 27 additions & 12 deletions

File tree

lib/index.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ const SQLiteOnSteroid = (db, myPeerId = null, options) => {
7070
let lastDetectMissingPatchesTimestamp = 0;
7171
let lastPingStatTimestamp = 0;
7272

73+
let isNextPingPersistent = false;
74+
7375
const peerSockets = {};
7476
const peerStats = {};
7577
const globalStatements = {
@@ -461,7 +463,9 @@ const SQLiteOnSteroid = (db, myPeerId = null, options) => {
461463
}*/
462464

463465
function _generatePingStatMessage (persist = false) {
464-
if (persist === true) {
466+
if (persist === true || isNextPingPersistent === true) {
467+
// WHen a new peer connect, we need to send a persistent ping stat message to make sure he is synced
468+
isNextPingPersistent = false;
465469
return upsert(PENDING_PATCHES_TABLE_NAME, peerStats);
466470
}
467471
const _ping = {
@@ -603,6 +607,7 @@ const SQLiteOnSteroid = (db, myPeerId = null, options) => {
603607
return;
604608
}
605609
nbConnectedPeers++;
610+
isNextPingPersistent = true;
606611
// init peer stats only if not already initialized
607612
if (!peerStats[remotePeerId]) {
608613
peerStats[remotePeerId] = [0,0,0,0,0];

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "replic-sqlite",
3-
"version": "0.2.11",
3+
"version": "0.2.12",
44
"description": "Simple, Fast, Multi-writer, Convergent, Replicated SQLite with 800 LOC only",
55
"main": "lib/index.js",
66
"directories": {

test/test.main.js

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -726,20 +726,30 @@ describe('main', function () {
726726
});
727727

728728
it('should send non persistent peer stat message to all peers and it should not increment the sequence id', function (done) {
729-
app._generatePingStatMessage(false);
729+
MockDate.set(1759276800000); // 1759276800000
730+
app._generatePingStatMessage(false); // should still send a persistent ping stat message because we have new peer connected
730731
const _patchRows = db.prepare('SELECT * FROM pending_patches').all();
731-
assert.equal(_patchRows.length, 0);
732-
assert.deepStrictEqual(messageSentToPeer10, [{ type : 20 /* PEER_STATS */, at : 0, peer : 1, seq : 0, ver : 1, tab : '_', delta : { 2 : [0, 0, 0, 0, 0], 10 : [0, 0, 0, 0, 0] } }]);
733-
assert.deepStrictEqual(messageSentToPeer2, [{ type : 20 /* PEER_STATS */ , at : 0, peer : 1, seq : 0, ver : 1, tab : '_', delta : { 2 : [0, 0, 0, 0, 0], 10 : [0, 0, 0, 0, 0] } }]);
732+
assert.equal(_patchRows.length, 1);
733+
assert.deepStrictEqual(messageSentToPeer10, [{ type : 10 /* PEER_STATS */, at : 193226342400000, peer : 1, seq : 1, ver : 1, tab : '_', delta : { 2 : [0, 0, 0, 0, 0], 10 : [0, 0, 0, 0, 0] } }]);
734+
assert.deepStrictEqual(messageSentToPeer2, [{ type : 10 /* PEER_STATS */ , at : 193226342400000, peer : 1, seq : 1, ver : 1, tab : '_', delta : { 2 : [0, 0, 0, 0, 0], 10 : [0, 0, 0, 0, 0] } }]);
735+
MockDate.reset();
736+
// should send non persistent ping stat
737+
app._generatePingStatMessage(false);
738+
const _patchRows2 = db.prepare('SELECT * FROM pending_patches').all();
739+
assert.equal(_patchRows2.length, 1);
740+
assert.deepStrictEqual(messageSentToPeer10[1], { type : 20 /* PEER_STATS */, at : 193226342400000, peer : 1, seq : 1, ver : 1, tab : '_', delta : { 2 : [0, 0, 0, 0, 0], 10 : [0, 0, 0, 0, 0] } });
741+
assert.deepStrictEqual(messageSentToPeer2[1], { type : 20 /* PEER_STATS */ , at : 193226342400000, peer : 1, seq : 1, ver : 1, tab : '_', delta : { 2 : [0, 0, 0, 0, 0], 10 : [0, 0, 0, 0, 0] } });
742+
734743
// create a persistent ping messgae
735744
app._generatePingStatMessage(true);
736-
assert(Math.abs(hlc.toUnixTimestamp(messageSentToPeer10[1].at) - Date.now()) < 500, 'Timestamps should be within 500ms of each other');
737-
assert.equal(messageSentToPeer10[1].seq, 1);
745+
assert(Math.abs(hlc.toUnixTimestamp(messageSentToPeer10[2].at) - Date.now()) < 500, 'Timestamps should be within 500ms of each other');
746+
assert.equal(messageSentToPeer10[2].seq, 2);
747+
assert.equal(messageSentToPeer2[2].seq, 2);
738748
// verify that the next non persistent ping stat message is sent with the same sequence id and timestamp
739749
setTimeout(() => {
740750
app._generatePingStatMessage(false);
741-
assert.equal(messageSentToPeer10[2].seq, 1);
742-
assert.equal(messageSentToPeer10[2].at, messageSentToPeer10[1].at);
751+
assert.equal(messageSentToPeer10[3].seq, 2);
752+
assert.equal(messageSentToPeer10[3].at, messageSentToPeer10[2].at);
743753
done();
744754
}, 100);
745755
});

0 commit comments

Comments
 (0)