Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/backend/conat/test/cluster/converge.test.ts
1712 views
1
/*
2
3
pnpm test `pwd`/converge.test.ts
4
5
6
*/
7
8
import {
9
before,
10
after,
11
waitForConsistentState,
12
delay,
13
} from "@cocalc/backend/conat/test/setup";
14
import { createClusterNode } from "./util";
15
16
beforeAll(before);
17
18
const TIMEOUT = 30_000;
19
jest.setTimeout(TIMEOUT);
20
21
const clusterSize = 8;
22
describe(`explicitly build a cluster with ${clusterSize} nodes and ensure state converges`, () => {
23
const servers: any[] = [],
24
clients: any[] = [];
25
it(`create ${clusterSize} distinct servers with cluster support enabled`, async () => {
26
for (let i = 0; i < clusterSize; i++) {
27
const { server, client } = await createClusterNode({
28
clusterName: "my-cluster",
29
id: `node-${i}`,
30
});
31
expect(server.options.id).toBe(`node-${i}`);
32
expect(server.options.clusterName).toBe("my-cluster");
33
servers.push(server);
34
clients.push(client);
35
}
36
});
37
38
it("link them all together in a complete digraph", async () => {
39
for (let i = 0; i < servers.length; i++) {
40
for (let j = 0; j < servers.length; j++) {
41
if (i != j) {
42
await servers[i].join(servers[j].address());
43
await servers[j].join(servers[i].address());
44
}
45
}
46
}
47
});
48
49
it("check that interest data is *eventually* consistent", async () => {
50
await waitForConsistentState(servers, TIMEOUT);
51
});
52
53
it("check again that interest data is *eventually* consistent", async () => {
54
await delay(1000);
55
await waitForConsistentState(servers, TIMEOUT);
56
});
57
});
58
59
afterAll(after);
60
61