Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/backend/conat/test/persist/cluster2.test.ts
1712 views
1
/*
2
3
pnpm test `pwd`/cluster2.test.ts
4
5
*/
6
7
import { server as createPersistServer } from "@cocalc/backend/conat/persist";
8
import {
9
after,
10
before,
11
server,
12
addNodeToDefaultCluster,
13
once,
14
persistServer as persistServer0,
15
waitForConsistentState,
16
wait,
17
} from "../setup";
18
import { uuid } from "@cocalc/util/misc";
19
const BROKEN_THRESH = 30;
20
21
beforeAll(before);
22
23
describe("test using multiple persist servers in a cluster", () => {
24
let client0, server1, client1;
25
it("add another node", async () => {
26
client0 = server.client();
27
server1 = await addNodeToDefaultCluster();
28
client1 = server1.client();
29
});
30
31
it("wait until both servers in the cluster have the same state", async () => {
32
await waitForConsistentState([server, server1], 5000);
33
});
34
35
let persistServer1;
36
it("add a second persist server connected to server1", async () => {
37
persistServer1 = createPersistServer({ client: client1 });
38
await once(persistServer1, "ready");
39
expect(persistServer1.state).toBe("ready");
40
});
41
42
it("wait until both servers in the cluster have the same state", async () => {
43
await waitForConsistentState([server, server1]);
44
});
45
46
const openStreamsConnectedToBothServers0: any[] = [];
47
const openStreamsConnectedToBothServers1: any[] = [];
48
it("create more streams connected to both servers, in each case illustrating as well that the stream works from both clients", async () => {
49
expect(Object.keys(persistServer0.sockets).length).toBe(0);
50
expect(Object.keys(persistServer1.sockets).length).toBe(0);
51
// create random streams, until we get at least one new one connected to each
52
// of the two persist servers
53
while (
54
Object.keys(persistServer0.sockets).length == 0 ||
55
Object.keys(persistServer1.sockets).length == 0
56
) {
57
const project_id = uuid();
58
const s = await client1.sync.dstream({
59
project_id,
60
name: "foo",
61
noCache: true,
62
// we make these ephemeral so there's no possibility of communication via the filesystem
63
// in case different persist servers were used!
64
ephemeral: true,
65
});
66
s.publish("x");
67
await s.save();
68
openStreamsConnectedToBothServers0.push(s);
69
if (openStreamsConnectedToBothServers0.length > BROKEN_THRESH) {
70
throw Error("sticky queue groups are clearly not working properly");
71
}
72
const t = await client0.sync.dstream({
73
project_id,
74
name: "foo",
75
noCache: true,
76
ephemeral: true,
77
});
78
openStreamsConnectedToBothServers1.push(t);
79
80
expect(t.getAll()).toEqual(["x"]);
81
t.publish("y");
82
await t.save();
83
84
await wait({ until: () => s.length == 2 });
85
expect(s.getAll()).toEqual(["x", "y"]);
86
}
87
expect(openStreamsConnectedToBothServers0.length).toBeGreaterThan(1);
88
expect(openStreamsConnectedToBothServers1.length).toBeGreaterThan(1);
89
});
90
});
91
92
afterAll(after);
93
94