antietcd 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/anticluster.js +11 -1
- package/antietcd-app.js +3 -2
- package/antietcd.js +21 -13
- package/antilocker.js +7 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -105,17 +105,19 @@ Options:
|
|
|
105
105
|
<dd>Use TLS with this key file (PEM format)</dd>
|
|
106
106
|
|
|
107
107
|
<dt>--ca <ca></dt>
|
|
108
|
-
<dd>Use trusted root certificates from this file
|
|
109
|
-
|
|
108
|
+
<dd>Use trusted root certificates from this file</dd>
|
|
109
|
+
|
|
110
|
+
<dt>--peer_ca <cert></dt>
|
|
111
|
+
<dd>Use this CA to verify peer antietcd certificates (defaults to the same --cert)</dd>
|
|
110
112
|
|
|
111
113
|
<dt>--client_cert_auth 1</dt>
|
|
112
|
-
<dd>Require TLS client certificates signed by <ca> or by default CA to connect
|
|
114
|
+
<dd>Require TLS client certificates signed by <ca> or by default CA to connect</dd>
|
|
113
115
|
|
|
114
116
|
<dt>--ws_keepalive_interval 30000</dt>
|
|
115
117
|
<dd>Client websocket ping (keepalive) interval in milliseconds</dd>
|
|
116
118
|
|
|
117
119
|
<dt>--use_base64 1</dt>
|
|
118
|
-
<dd>Use base64 encoding of keys and values, like in etcd (enabled by default)
|
|
120
|
+
<dd>Use base64 encoding of keys and values, like in etcd (enabled by default)</dd>
|
|
119
121
|
|
|
120
122
|
</dl>
|
|
121
123
|
|
|
@@ -576,7 +578,6 @@ type ServerMessage = {
|
|
|
576
578
|
- 400 for invalid requests
|
|
577
579
|
- 404 for unsupported API / URL not found
|
|
578
580
|
- 405 for non-POST request method
|
|
579
|
-
- 408 for lock wait timeouts
|
|
580
581
|
- 501 for unsupported API feature - non-directory range queries and so on
|
|
581
582
|
- 502 for server is stopping
|
|
582
583
|
- 503 for quorum-related errors - quorum not available and so on
|
package/anticluster.js
CHANGED
|
@@ -29,6 +29,16 @@ class AntiCluster
|
|
|
29
29
|
this.cfg.cluster = (''+this.cfg.cluster).trim().split(/[\s,]*,[\s,]*/)
|
|
30
30
|
.reduce((a, c) => { c = c.split(/\s*=\s*/); a[c[0]] = c[1]; return a; }, {});
|
|
31
31
|
}
|
|
32
|
+
this.tls = {};
|
|
33
|
+
if (antietcd.tls)
|
|
34
|
+
{
|
|
35
|
+
this.tls = {
|
|
36
|
+
cert: antietcd.tls.cert,
|
|
37
|
+
key: antietcd.tls.key,
|
|
38
|
+
ca: antietcd.peer_ca || antietcd.tls.cert,
|
|
39
|
+
requestCert: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
32
42
|
this.raft = new TinyRaft({
|
|
33
43
|
nodes: Object.keys(this.cfg.cluster),
|
|
34
44
|
nodeId: this.cfg.node_id,
|
|
@@ -53,7 +63,7 @@ class AntiCluster
|
|
|
53
63
|
if (node_id != this.cfg.node_id && this.cfg.cluster[node_id] &&
|
|
54
64
|
(!this.cluster_connections[node_id] || !this.antietcd.clients[this.cluster_connections[node_id]]))
|
|
55
65
|
{
|
|
56
|
-
const socket = new ws.WebSocket(this.cfg.cluster[node_id].replace(/^http/, 'ws'), this.
|
|
66
|
+
const socket = new ws.WebSocket(this.cfg.cluster[node_id].replace(/^http/, 'ws'), this.tls);
|
|
57
67
|
const client_id = this.antietcd._startWebsocket(socket, () => setTimeout(() => this.connectToNode(node_id), this.cfg.reconnect_interval||1000));
|
|
58
68
|
this.cluster_connections[node_id] = client_id;
|
|
59
69
|
socket.on('open', () =>
|
package/antietcd-app.js
CHANGED
|
@@ -13,7 +13,7 @@ License: Mozilla Public License 2.0 or Vitastor Network Public License 1.1
|
|
|
13
13
|
Usage:
|
|
14
14
|
|
|
15
15
|
${process.argv[0]} ${process.argv[1]} \n\
|
|
16
|
-
[--cert ssl.crt] [--key ssl.key] [--port 12379] \n\
|
|
16
|
+
[--cert ssl.crt] [--key ssl.key] [--ca ca.crt] [--peer_ca ssl.crt] [--port 12379] \n\
|
|
17
17
|
[--data data.gz] [--persist-filter ./filter.js] [--persist_interval 500] \n\
|
|
18
18
|
[--node_id node1 --cluster_key abcdef --cluster node1=http://localhost:12379,node2=http://localhost:12380,node3=http://localhost:12381] \n\
|
|
19
19
|
[other options]
|
|
@@ -38,7 +38,8 @@ HTTP:
|
|
|
38
38
|
Use TLS with this key file (PEM format)
|
|
39
39
|
--ca <ca>
|
|
40
40
|
Use trusted root certificates from this file.
|
|
41
|
-
|
|
41
|
+
--peer_ca <cert>
|
|
42
|
+
Use this CA to verify peer antietcd certificates (defaults to the same --cert).
|
|
42
43
|
--client_cert_auth 1
|
|
43
44
|
Require TLS client certificates signed by <ca> or by default CA to connect.
|
|
44
45
|
--ws_keepalive_interval 30000
|
package/antietcd.js
CHANGED
|
@@ -20,7 +20,7 @@ const AntiCluster = require('./anticluster.js');
|
|
|
20
20
|
const AntiLocker = require('./antilocker.js');
|
|
21
21
|
const { runCallbacks, de64, b64, RequestError } = require('./common.js');
|
|
22
22
|
|
|
23
|
-
const VERSION = '1.2.
|
|
23
|
+
const VERSION = '1.2.4';
|
|
24
24
|
|
|
25
25
|
class AntiEtcd extends EventEmitter
|
|
26
26
|
{
|
|
@@ -53,6 +53,7 @@ class AntiEtcd extends EventEmitter
|
|
|
53
53
|
this.locker = null;
|
|
54
54
|
this.stored_term = 0;
|
|
55
55
|
this.cfg = cfg;
|
|
56
|
+
this.peer_ca = null;
|
|
56
57
|
this.loading = false;
|
|
57
58
|
this.stopped = false;
|
|
58
59
|
this.inflight = 0;
|
|
@@ -62,6 +63,25 @@ class AntiEtcd extends EventEmitter
|
|
|
62
63
|
|
|
63
64
|
async start()
|
|
64
65
|
{
|
|
66
|
+
if (this.cfg.cert)
|
|
67
|
+
{
|
|
68
|
+
this.tls = {
|
|
69
|
+
key: await fsp.readFile(this.cfg.key),
|
|
70
|
+
cert: await fsp.readFile(this.cfg.cert),
|
|
71
|
+
};
|
|
72
|
+
if (this.cfg.ca)
|
|
73
|
+
{
|
|
74
|
+
this.tls.ca = await fsp.readFile(this.cfg.ca);
|
|
75
|
+
}
|
|
76
|
+
if (this.cfg.client_cert_auth)
|
|
77
|
+
{
|
|
78
|
+
this.tls.requestCert = true;
|
|
79
|
+
}
|
|
80
|
+
if (this.cfg.peer_ca)
|
|
81
|
+
{
|
|
82
|
+
this.peer_ca = await fsp.readFile(this.cfg.peer_ca);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
65
85
|
if (this.cfg.data || this.cfg.cluster)
|
|
66
86
|
{
|
|
67
87
|
this.etctree.set_replicate_watcher(msg => this._persistAndReplicate(msg));
|
|
@@ -83,18 +103,6 @@ class AntiEtcd extends EventEmitter
|
|
|
83
103
|
}
|
|
84
104
|
if (this.cfg.cert)
|
|
85
105
|
{
|
|
86
|
-
this.tls = {
|
|
87
|
-
key: await fsp.readFile(this.cfg.key),
|
|
88
|
-
cert: await fsp.readFile(this.cfg.cert),
|
|
89
|
-
};
|
|
90
|
-
if (this.cfg.ca)
|
|
91
|
-
{
|
|
92
|
-
this.tls.ca = await fsp.readFile(this.cfg.ca);
|
|
93
|
-
}
|
|
94
|
-
if (this.cfg.client_cert_auth)
|
|
95
|
-
{
|
|
96
|
-
this.tls.requestCert = true;
|
|
97
|
-
}
|
|
98
106
|
this.server = https.createServer(this.tls, (req, res) => this._handleRequest(req, res));
|
|
99
107
|
}
|
|
100
108
|
else
|
package/antilocker.js
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
// (c) Vitaliy Filippov, 2024+
|
|
3
3
|
// License: Mozilla Public License 2.0 or Vitastor Network Public License 1.1
|
|
4
4
|
|
|
5
|
-
const { RequestError } = require('./common.js');
|
|
6
|
-
|
|
7
5
|
// How does it work:
|
|
8
6
|
// - Leader sets key-level locks, persists and replicates the change, then removes locks
|
|
9
7
|
// - Followers set locks, persist and reply to the leader, wait for the feedback, then remove locks
|
|
@@ -128,7 +126,7 @@ class AntiLocker
|
|
|
128
126
|
wait_commit(mod_revision, expire_ts)
|
|
129
127
|
{
|
|
130
128
|
// Postpone transaction
|
|
131
|
-
return new Promise(
|
|
129
|
+
return new Promise(ok => this._set_on_unlock(mod_revision, expire_ts, ok));
|
|
132
130
|
}
|
|
133
131
|
|
|
134
132
|
break_locks()
|
|
@@ -139,12 +137,12 @@ class AntiLocker
|
|
|
139
137
|
this.on_unlock = [];
|
|
140
138
|
for (const wait of waits)
|
|
141
139
|
{
|
|
142
|
-
const cb = wait.
|
|
143
|
-
cb(
|
|
140
|
+
const cb = wait.ok;
|
|
141
|
+
cb();
|
|
144
142
|
}
|
|
145
143
|
}
|
|
146
144
|
|
|
147
|
-
_set_on_unlock(lock_rev, expire_ts, ok
|
|
145
|
+
_set_on_unlock(lock_rev, expire_ts, ok)
|
|
148
146
|
{
|
|
149
147
|
let min = 0, max = this.on_unlock.length;
|
|
150
148
|
while (max-min > 1)
|
|
@@ -155,7 +153,7 @@ class AntiLocker
|
|
|
155
153
|
else
|
|
156
154
|
min = mid;
|
|
157
155
|
}
|
|
158
|
-
this.on_unlock.splice(min, 0, { revision: lock_rev, expire_ts, ok
|
|
156
|
+
this.on_unlock.splice(min, 0, { revision: lock_rev, expire_ts, ok });
|
|
159
157
|
}
|
|
160
158
|
|
|
161
159
|
_timeout_locks()
|
|
@@ -173,8 +171,8 @@ class AntiLocker
|
|
|
173
171
|
}
|
|
174
172
|
for (const wait of cancel)
|
|
175
173
|
{
|
|
176
|
-
const cb = wait.
|
|
177
|
-
cb(
|
|
174
|
+
const cb = wait.ok;
|
|
175
|
+
cb();
|
|
178
176
|
}
|
|
179
177
|
}
|
|
180
178
|
|