Compare commits

...

2 Commits

Author SHA1 Message Date
Guido D'Orsi
fc7d49a703 chore: changeset 2024-11-28 01:25:19 +01:00
Guido D'Orsi
5ea35213c9 chore: make possible to disable the retry on unavailable 2024-11-28 01:14:10 +01:00
5 changed files with 57 additions and 2 deletions

View File

@@ -0,0 +1,5 @@
---
"cojson": patch
---
Added a feature flag to disable the retry on unavailable coValues

View File

@@ -4,6 +4,7 @@ import {
QueueEntry,
} from "./PriorityBasedMessageQueue.js";
import { TryAddTransactionsError } from "./coValueCore.js";
import { isFeatureEnabled } from "./featureFlags.js";
import { RawCoID } from "./ids.js";
import { CO_VALUE_PRIORITY } from "./priority.js";
import { Peer, SyncMessage } from "./sync.js";
@@ -58,7 +59,10 @@ export class PeerState {
}
shouldRetryUnavailableCoValues() {
return this.peer.role === "server";
return (
isFeatureEnabled("RetryUnavailableCoValues") &&
this.peer.role === "server"
);
}
isServerOrStoragePeer() {

View File

@@ -23,6 +23,7 @@ import {
secretSeedLength,
shortHashLength,
} from "./crypto/crypto.js";
import { setFeatureFlag } from "./featureFlags.js";
import { isRawCoID, rawCoIDfromBytes, rawCoIDtoBytes } from "./ids.js";
import { parseJSON } from "./jsonStringify.js";
import { LocalNode } from "./localNode.js";
@@ -116,6 +117,7 @@ export {
SyncMessage,
isRawCoID,
LSMStorage,
setFeatureFlag,
};
export type {

View File

@@ -0,0 +1,16 @@
const featureFlags = {
RetryUnavailableCoValues: true,
};
export function isFeatureEnabled(feature: keyof typeof featureFlags) {
return featureFlags[feature];
}
export function setFeatureFlag(
feature: keyof typeof featureFlags,
enabled: boolean,
) {
featureFlags[feature] = enabled;
}
export default featureFlags;

View File

@@ -1,6 +1,7 @@
import { describe, expect, test, vi } from "vitest";
import { beforeEach, describe, expect, test, vi } from "vitest";
import { PeerKnownStateActions } from "../PeerKnownStates.js";
import { PeerState } from "../PeerState.js";
import { setFeatureFlag } from "../featureFlags.js";
import { CO_VALUE_PRIORITY } from "../priority.js";
import { Peer, SyncMessage } from "../sync.js";
@@ -20,6 +21,10 @@ function setup() {
return { mockPeer, peerState };
}
beforeEach(() => {
setFeatureFlag("RetryUnavailableCoValues", true);
});
describe("PeerState", () => {
test("should push outgoing message to peer", async () => {
const { mockPeer, peerState } = setup();
@@ -188,4 +193,27 @@ describe("PeerState", () => {
expect(knownStatesSpy).toHaveBeenCalledWith(action);
expect(optimisticKnownStatesSpy).toHaveBeenCalledWith(action);
});
describe("shouldRetryUnavailableCoValues", () => {
test("returns false for non-server peers", () => {
const clientPeer = new PeerState({ role: "client" } as Peer, undefined);
const storagePeer = new PeerState({ role: "storage" } as Peer, undefined);
expect(clientPeer.shouldRetryUnavailableCoValues()).toBe(false);
expect(storagePeer.shouldRetryUnavailableCoValues()).toBe(false);
});
test("returns true for server peers", () => {
const serverPeer = new PeerState({ role: "server" } as Peer, undefined);
expect(serverPeer.shouldRetryUnavailableCoValues()).toBe(true);
});
test("returns false if the feature is disabled", () => {
setFeatureFlag("RetryUnavailableCoValues", false);
const serverPeer = new PeerState({ role: "server" } as Peer, undefined);
expect(serverPeer.shouldRetryUnavailableCoValues()).toBe(false);
});
});
});