@teepin/sdk 0.3.0 → 0.4.0
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/dist/cjs/client.js +3 -1
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/direct/engine.js +49 -59
- package/dist/cjs/direct/engine.js.map +1 -1
- package/dist/cjs/direct/packing.js +549 -0
- package/dist/cjs/direct/packing.js.map +1 -0
- package/dist/cjs/direct/uploads.js +336 -64
- package/dist/cjs/direct/uploads.js.map +1 -1
- package/dist/esm/client.js +3 -1
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/direct/engine.js +45 -55
- package/dist/esm/direct/engine.js.map +1 -1
- package/dist/esm/direct/packing.js +536 -0
- package/dist/esm/direct/packing.js.map +1 -0
- package/dist/esm/direct/uploads.js +337 -65
- package/dist/esm/direct/uploads.js.map +1 -1
- package/dist/types/client.d.ts +1 -1
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/direct/engine.d.ts +37 -21
- package/dist/types/direct/engine.d.ts.map +1 -1
- package/dist/types/direct/packing.d.ts +207 -0
- package/dist/types/direct/packing.d.ts.map +1 -0
- package/dist/types/direct/uploads.d.ts +66 -13
- package/dist/types/direct/uploads.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 TEEPIN Project
|
|
3
|
+
// Licensed under the Apache License, Version 2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.schedule = exports.remnantAlone = exports.absorbCap = exports.InFlight = exports.Arrivals = exports.decide = exports.planPack = exports.atSpeed = exports.limitsFromJSON = exports.requestBudget = exports.DEFAULT_LIMITS = exports.SLOW = exports.MAX_PACK_BYTES = exports.MEMORY_CAP = exports.REQUEST_OVERHEAD = exports.COMMIT_SAMPLES = exports.COMMIT_USUAL_START_MS = exports.MAX_OBSERVE_MS = exports.DEFAULT_OBSERVE_MS = exports.DEFAULT_SETTLE_MS = exports.DEFAULT_RATE_WINDOW_MS = exports.DEFAULT_WAIT_MS = exports.DEFAULT_MAX_REQUEST = exports.DEFAULT_MAX_PACK_OBJECTS = exports.DEFAULT_MAX_OBJECTS = exports.DEFAULT_CEILING = exports.DEFAULT_FLOOR = void 0;
|
|
6
|
+
// Pack sizes (TEEPIN-STORAGE-DESIGN.md section 28): every write to the storage network is at least 10 MiB, unless it
|
|
7
|
+
// is a leftover with its reason. Pure: no I/O and no clock of its own (times are passed in, in milliseconds), the same
|
|
8
|
+
// rules as the other uploaders, held to them by test/vectors/pack_planner.json.
|
|
9
|
+
//
|
|
10
|
+
// - PackLimits: the sizes and timings, built in and sent by the server with each reservation (28.15).
|
|
11
|
+
// - planPack: which waiting items the next pack takes (28.3, 28.17).
|
|
12
|
+
// - Arrivals: the running totals of one bucket's waiting saves, so the timing rule decides without planning.
|
|
13
|
+
// - decide: when a save's pack goes (28.4, 28.17, 28.25).
|
|
14
|
+
// - InFlight: the saves' packs in flight and when each is expected back, whose callers will very likely save again
|
|
15
|
+
// (28.25 point 2).
|
|
16
|
+
// - schedule: one dispatch's decisions for every bucket, oldest first (28.17's driver, without its slots and memory).
|
|
17
|
+
exports.DEFAULT_FLOOR = 10 * 2 ** 20;
|
|
18
|
+
exports.DEFAULT_CEILING = 20 * 2 ** 20;
|
|
19
|
+
exports.DEFAULT_MAX_OBJECTS = 10000;
|
|
20
|
+
/** The server's cap on a pack's objects: one that has just reached the floor, plus a run's tail (28.14). */
|
|
21
|
+
exports.DEFAULT_MAX_PACK_OBJECTS = 140000;
|
|
22
|
+
/** A reserve or sign body's limit on the server. */
|
|
23
|
+
exports.DEFAULT_MAX_REQUEST = 64 * 2 ** 20;
|
|
24
|
+
exports.DEFAULT_WAIT_MS = 5000;
|
|
25
|
+
exports.DEFAULT_RATE_WINDOW_MS = 1000;
|
|
26
|
+
exports.DEFAULT_SETTLE_MS = 200;
|
|
27
|
+
/**
|
|
28
|
+
* How long a pack under the floor waits before it may go as a leftover early (28.25 point 1): within it, a burst's
|
|
29
|
+
* arrivals land in the rate window. The server may send 0 to 2,000 ms.
|
|
30
|
+
*/
|
|
31
|
+
exports.DEFAULT_OBSERVE_MS = 300;
|
|
32
|
+
exports.MAX_OBSERVE_MS = 2000;
|
|
33
|
+
/** A commit's usual time until one is measured, and how many of the last ones its median takes (28.25 point 2). */
|
|
34
|
+
exports.COMMIT_USUAL_START_MS = 1500;
|
|
35
|
+
exports.COMMIT_SAMPLES = 8;
|
|
36
|
+
/** A reserve body's bytes besides its objects, with room to spare. */
|
|
37
|
+
exports.REQUEST_OVERHEAD = 512;
|
|
38
|
+
/** Pack bytes in flight per client (28.2): 16 full packs. */
|
|
39
|
+
exports.MEMORY_CAP = 320 * 2 ** 20;
|
|
40
|
+
/** The pack cap: no ceiling may pass it. */
|
|
41
|
+
exports.MAX_PACK_BYTES = 64 * 2 ** 20;
|
|
42
|
+
/** On a slow link a pack never shrinks below one TWS1 segment (28.7). Settable only for tests. */
|
|
43
|
+
exports.SLOW = { min: 64 * 2 ** 10 };
|
|
44
|
+
/** The limits a client starts with, until the server sends its own. */
|
|
45
|
+
exports.DEFAULT_LIMITS = Object.freeze({
|
|
46
|
+
floor: exports.DEFAULT_FLOOR,
|
|
47
|
+
ceiling: exports.DEFAULT_CEILING,
|
|
48
|
+
maxObjects: exports.DEFAULT_MAX_OBJECTS,
|
|
49
|
+
maxPackObjects: exports.DEFAULT_MAX_PACK_OBJECTS,
|
|
50
|
+
maxRequest: exports.DEFAULT_MAX_REQUEST,
|
|
51
|
+
waitMs: exports.DEFAULT_WAIT_MS,
|
|
52
|
+
windowMs: exports.DEFAULT_RATE_WINDOW_MS,
|
|
53
|
+
settleMs: exports.DEFAULT_SETTLE_MS,
|
|
54
|
+
observeMs: exports.DEFAULT_OBSERVE_MS,
|
|
55
|
+
});
|
|
56
|
+
/** The bytes a reserve body's objects may take. */
|
|
57
|
+
function requestBudget(l) {
|
|
58
|
+
return Math.max(0, l.maxRequest - exports.REQUEST_OVERHEAD);
|
|
59
|
+
}
|
|
60
|
+
exports.requestBudget = requestBudget;
|
|
61
|
+
const LIMIT_FIELDS = [
|
|
62
|
+
'floor_bytes',
|
|
63
|
+
'ceiling_bytes',
|
|
64
|
+
'max_objects',
|
|
65
|
+
'max_pack_objects',
|
|
66
|
+
'max_request_bytes',
|
|
67
|
+
'wait_ms',
|
|
68
|
+
'rate_window_ms',
|
|
69
|
+
'settle_ms',
|
|
70
|
+
];
|
|
71
|
+
/**
|
|
72
|
+
* The reserve answer's limits (28.15), whole or not at all: undefined when absent or when any value breaks section
|
|
73
|
+
* 28's rules (the caller then keeps what it has).
|
|
74
|
+
*/
|
|
75
|
+
function limitsFromJSON(d) {
|
|
76
|
+
if (!d || typeof d !== 'object')
|
|
77
|
+
return undefined;
|
|
78
|
+
const o = d;
|
|
79
|
+
const v = {};
|
|
80
|
+
for (const k of LIMIT_FIELDS) {
|
|
81
|
+
const x = o[k];
|
|
82
|
+
if (typeof x !== 'number' || !Number.isSafeInteger(x))
|
|
83
|
+
return undefined;
|
|
84
|
+
v[k] = x;
|
|
85
|
+
}
|
|
86
|
+
const floor = v.floor_bytes;
|
|
87
|
+
const ceiling = v.ceiling_bytes;
|
|
88
|
+
if (floor < 2 ** 20 || ceiling < 2 * floor || ceiling > exports.MAX_PACK_BYTES)
|
|
89
|
+
return undefined;
|
|
90
|
+
if (v.max_objects < 1 || v.max_pack_objects < 1 || v.max_request_bytes < 2 ** 20)
|
|
91
|
+
return undefined;
|
|
92
|
+
for (const k of ['wait_ms', 'rate_window_ms', 'settle_ms'])
|
|
93
|
+
if (v[k] < 0 || v[k] > 60000)
|
|
94
|
+
return undefined;
|
|
95
|
+
// observe_ms (28.25) is optional: a server before it sends none, and its other limits still hold.
|
|
96
|
+
let observe = o.observe_ms;
|
|
97
|
+
if (observe === undefined || observe === null)
|
|
98
|
+
observe = exports.DEFAULT_OBSERVE_MS;
|
|
99
|
+
else if (typeof observe !== 'number' || !Number.isSafeInteger(observe) || observe < 0 || observe > exports.MAX_OBSERVE_MS)
|
|
100
|
+
return undefined;
|
|
101
|
+
return {
|
|
102
|
+
floor,
|
|
103
|
+
ceiling,
|
|
104
|
+
maxObjects: v.max_objects,
|
|
105
|
+
maxPackObjects: v.max_pack_objects,
|
|
106
|
+
maxRequest: v.max_request_bytes,
|
|
107
|
+
waitMs: v.wait_ms,
|
|
108
|
+
windowMs: v.rate_window_ms,
|
|
109
|
+
settleMs: v.settle_ms,
|
|
110
|
+
observeMs: observe,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
exports.limitsFromJSON = limitsFromJSON;
|
|
114
|
+
/**
|
|
115
|
+
* l at the measured speed (28.7): requestBytes is what one request carries in 240 s (undefined before anything is
|
|
116
|
+
* measured). The ceiling comes down toward the floor. Under the floor the link is slow: packs shrink as before section
|
|
117
|
+
* 28, each taking files only while it stays within that size (at least SLOW.min), so the floor is one byte and the
|
|
118
|
+
* ceiling that size.
|
|
119
|
+
*/
|
|
120
|
+
function atSpeed(l, requestBytes) {
|
|
121
|
+
if (requestBytes === undefined || requestBytes >= l.ceiling)
|
|
122
|
+
return [{ ...l }, false];
|
|
123
|
+
if (requestBytes >= l.floor)
|
|
124
|
+
return [{ ...l, ceiling: requestBytes }, false];
|
|
125
|
+
return [{ ...l, floor: 1, ceiling: Math.max(exports.SLOW.min, requestBytes) }, true];
|
|
126
|
+
}
|
|
127
|
+
exports.atSpeed = atSpeed;
|
|
128
|
+
/**
|
|
129
|
+
* Which of items (in order) the next pack takes (28.3, 28.17):
|
|
130
|
+
* - an item whose key is in the pack, or among the earlier items left, waits (writes to one key keep their order);
|
|
131
|
+
* - under the floor, the pack takes the next item whatever its size and the count, until its reserve body would pass
|
|
132
|
+
* the request budget (request_limited);
|
|
133
|
+
* - at or over the floor, it takes an item only if it stays at or under the ceiling, under maxObjects and within the
|
|
134
|
+
* request budget; a pack that turned one away is full, else ready;
|
|
135
|
+
* - tail (runs): when everything left is over zero and under the floor, and can join (no key in it waits on another),
|
|
136
|
+
* the pack takes it all, within maxPackObjects and the request budget; with tailCap (a save's remnant, 28.25), only
|
|
137
|
+
* while the pack stays within that many stored bytes.
|
|
138
|
+
*/
|
|
139
|
+
function planPack(items, storedOf, keyOf, requestOf, l, tail = false, tailCap) {
|
|
140
|
+
const pack = [];
|
|
141
|
+
let rest = [];
|
|
142
|
+
const keys = new Set();
|
|
143
|
+
const restKeys = new Set();
|
|
144
|
+
let stored = 0;
|
|
145
|
+
let request = 0;
|
|
146
|
+
let turned = false;
|
|
147
|
+
let limited = false;
|
|
148
|
+
const budget = requestBudget(l);
|
|
149
|
+
for (const it of items) {
|
|
150
|
+
const k = keyOf(it);
|
|
151
|
+
if (keys.has(k) || restKeys.has(k)) {
|
|
152
|
+
rest.push(it);
|
|
153
|
+
restKeys.add(k);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const n = storedOf(it);
|
|
157
|
+
const r = requestOf(it);
|
|
158
|
+
let take;
|
|
159
|
+
if (stored < l.floor) {
|
|
160
|
+
take = !limited && (pack.length === 0 || request + r <= budget);
|
|
161
|
+
limited = !take;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
take = stored + n <= l.ceiling && pack.length < l.maxObjects && request + r <= budget;
|
|
165
|
+
turned = turned || !take;
|
|
166
|
+
}
|
|
167
|
+
if (take) {
|
|
168
|
+
pack.push(it);
|
|
169
|
+
keys.add(k);
|
|
170
|
+
stored += n;
|
|
171
|
+
request += r;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
rest.push(it);
|
|
175
|
+
restKeys.add(k);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (tail && rest.length > 0 && joins(rest, keyOf, keys)) {
|
|
179
|
+
let size = 0;
|
|
180
|
+
let req = 0;
|
|
181
|
+
for (const it of rest) {
|
|
182
|
+
size += storedOf(it);
|
|
183
|
+
req += requestOf(it);
|
|
184
|
+
}
|
|
185
|
+
if (size < l.floor && pack.length + rest.length <= l.maxPackObjects && request + req <= budget && (tailCap === undefined || stored + size <= tailCap)) {
|
|
186
|
+
pack.push(...rest);
|
|
187
|
+
stored += size;
|
|
188
|
+
request += req;
|
|
189
|
+
rest = [];
|
|
190
|
+
turned = false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const state = stored >= l.floor ? (turned ? 'full' : 'ready') : limited ? 'request_limited' : 'under';
|
|
194
|
+
return { pack, rest, state, stored, request };
|
|
195
|
+
}
|
|
196
|
+
exports.planPack = planPack;
|
|
197
|
+
function joins(rest, keyOf, keys) {
|
|
198
|
+
const seen = new Set(keys);
|
|
199
|
+
for (const it of rest) {
|
|
200
|
+
const k = keyOf(it);
|
|
201
|
+
if (seen.has(k))
|
|
202
|
+
return false;
|
|
203
|
+
seen.add(k);
|
|
204
|
+
}
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* When a save's pack goes (28.4, 28.17, 28.25). waiting is the stored bytes that can join the next pack; oldest and last
|
|
209
|
+
* the first and latest arrival among them; arrivals the saves that arrived ready to join, without the oldest waiting
|
|
210
|
+
* file's own (28.22: it says nothing about what comes next). A pack that would send with no free slot is idle.
|
|
211
|
+
*
|
|
212
|
+
* A pack under the floor goes at its time limit. Before it, it goes early only when nothing says a batch is forming
|
|
213
|
+
* (28.25):
|
|
214
|
+
* - not before its oldest file has waited l.observeMs, so a burst's arrivals reach the rate window first; unless a later
|
|
215
|
+
* write to one of its keys waits behind it (only its going lets that write go: 75 saves to one key still go one by one
|
|
216
|
+
* at once);
|
|
217
|
+
* - coming: the stored bytes of this bucket's packs in flight expected back before the time limit count as arriving, as
|
|
218
|
+
* their callers will very likely save again;
|
|
219
|
+
* - not while contested: another pack waits for a slot or settles (a full or ready one, or a run's next pack), which a
|
|
220
|
+
* leftover must not take.
|
|
221
|
+
*/
|
|
222
|
+
function decide(state, waiting, oldest, last, arrivals, now, l, slotFree, coming = 0, contested = false, behind = false) {
|
|
223
|
+
const send = (reason) => (slotFree ? (reason ? { kind: 'send', reason, at: 0 } : { kind: 'send', at: 0 }) : { kind: 'idle', at: 0 });
|
|
224
|
+
if (state === 'full')
|
|
225
|
+
return send();
|
|
226
|
+
if (state === 'request_limited')
|
|
227
|
+
return send('request_limit');
|
|
228
|
+
if (state === 'ready') {
|
|
229
|
+
const due = Math.min(last + l.settleMs, oldest + l.waitMs);
|
|
230
|
+
return now >= due ? send() : { kind: 'wait', at: due };
|
|
231
|
+
}
|
|
232
|
+
const left = oldest + l.waitMs - now;
|
|
233
|
+
if (left <= 0)
|
|
234
|
+
return send('leftover');
|
|
235
|
+
let at = oldest + l.waitMs;
|
|
236
|
+
if (!behind && now < oldest + l.observeMs)
|
|
237
|
+
return { kind: 'wait', at: Math.min(at, oldest + l.observeMs) };
|
|
238
|
+
let recent = 0;
|
|
239
|
+
let first;
|
|
240
|
+
for (const [t, b] of arrivals) {
|
|
241
|
+
if (t > now - l.windowMs) {
|
|
242
|
+
recent += b;
|
|
243
|
+
if (first === undefined || t < first)
|
|
244
|
+
first = t;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const rate = l.windowMs > 0 ? recent / l.windowMs : 0; // bytes per millisecond
|
|
248
|
+
if (!contested && waiting + coming + rate * left < l.floor)
|
|
249
|
+
return send('leftover');
|
|
250
|
+
if (first !== undefined)
|
|
251
|
+
at = Math.min(at, first + l.windowMs);
|
|
252
|
+
return { kind: 'wait', at };
|
|
253
|
+
}
|
|
254
|
+
exports.decide = decide;
|
|
255
|
+
/**
|
|
256
|
+
* One bucket's waiting saves and their running totals (28.17, 28.22). A save whose key already has an earlier write
|
|
257
|
+
* waiting can't join the next pack: it counts neither as bytes waiting nor as an arrival. When the earlier write leaves,
|
|
258
|
+
* it joins the bytes waiting, but never counts as an arrival. The first waiting save is always one that can join, so it
|
|
259
|
+
* is the oldest the timing rule looks at.
|
|
260
|
+
*/
|
|
261
|
+
class Arrivals {
|
|
262
|
+
entries = new Map(); // in arrival order
|
|
263
|
+
byKey = new Map();
|
|
264
|
+
seq = 0;
|
|
265
|
+
window = [];
|
|
266
|
+
/** The stored and reserve-request bytes that can join; the latest arrival among them. */
|
|
267
|
+
waiting = 0;
|
|
268
|
+
request = 0;
|
|
269
|
+
last = 0;
|
|
270
|
+
/** Waiting saves that can't join the next pack (an earlier write to their key waits). */
|
|
271
|
+
blocked = 0;
|
|
272
|
+
get size() {
|
|
273
|
+
return this.entries.size;
|
|
274
|
+
}
|
|
275
|
+
add(item, key, stored, request, now) {
|
|
276
|
+
this.seq += 1;
|
|
277
|
+
const same = this.byKey.get(key) ?? [];
|
|
278
|
+
const e = {
|
|
279
|
+
item,
|
|
280
|
+
key,
|
|
281
|
+
stored,
|
|
282
|
+
request,
|
|
283
|
+
at: now,
|
|
284
|
+
joins: same.length === 0,
|
|
285
|
+
seq: this.seq,
|
|
286
|
+
};
|
|
287
|
+
same.push(item);
|
|
288
|
+
this.byKey.set(key, same);
|
|
289
|
+
this.entries.set(item, e);
|
|
290
|
+
if (e.joins) {
|
|
291
|
+
this.waiting += stored;
|
|
292
|
+
this.request += request;
|
|
293
|
+
this.last = now;
|
|
294
|
+
this.window.push([now, stored, e.seq]);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
this.blocked += 1;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/** Items a pack took (or that left the queue). */
|
|
301
|
+
remove(items) {
|
|
302
|
+
for (const item of items) {
|
|
303
|
+
const e = this.entries.get(item);
|
|
304
|
+
if (!e)
|
|
305
|
+
continue;
|
|
306
|
+
this.entries.delete(item);
|
|
307
|
+
const same = (this.byKey.get(e.key) ?? []).filter((x) => x !== item);
|
|
308
|
+
if (e.joins) {
|
|
309
|
+
this.waiting -= e.stored;
|
|
310
|
+
this.request -= e.request;
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
this.blocked -= 1;
|
|
314
|
+
}
|
|
315
|
+
if (same.length === 0) {
|
|
316
|
+
this.byKey.delete(e.key);
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
this.byKey.set(e.key, same);
|
|
320
|
+
if (e.joins) {
|
|
321
|
+
const next = this.entries.get(same[0]);
|
|
322
|
+
if (!next.joins) {
|
|
323
|
+
next.joins = true;
|
|
324
|
+
this.blocked -= 1;
|
|
325
|
+
this.waiting += next.stored;
|
|
326
|
+
this.request += next.request;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/** The waiting items, in arrival order. */
|
|
332
|
+
items() {
|
|
333
|
+
return [...this.entries.keys()];
|
|
334
|
+
}
|
|
335
|
+
/** The first waiting item and when it arrived, or undefined. */
|
|
336
|
+
oldest() {
|
|
337
|
+
for (const e of this.entries.values())
|
|
338
|
+
return [e.item, e.at];
|
|
339
|
+
return undefined;
|
|
340
|
+
}
|
|
341
|
+
/** The arrivals within windowMs of now, without the oldest waiting item's own; older ones are forgotten. */
|
|
342
|
+
arrivals(now, windowMs) {
|
|
343
|
+
this.window = this.window.filter(([t]) => t > now - windowMs);
|
|
344
|
+
let skip = 0;
|
|
345
|
+
for (const e of this.entries.values()) {
|
|
346
|
+
skip = e.seq;
|
|
347
|
+
break;
|
|
348
|
+
}
|
|
349
|
+
return this.window.filter(([, , s]) => s !== skip).map(([t, b]) => [t, b]);
|
|
350
|
+
}
|
|
351
|
+
/** When a waiting item arrived. */
|
|
352
|
+
arrivedAt(item) {
|
|
353
|
+
return this.entries.get(item).at;
|
|
354
|
+
}
|
|
355
|
+
/** A waiting item's stored bytes. */
|
|
356
|
+
storedOf(item) {
|
|
357
|
+
return this.entries.get(item).stored;
|
|
358
|
+
}
|
|
359
|
+
/** The stored bytes of the saves that arrived able to join at t or later (within the rate window kept), waiting or not. */
|
|
360
|
+
arrivedSince(t) {
|
|
361
|
+
let n = 0;
|
|
362
|
+
for (const [at, b] of this.window)
|
|
363
|
+
if (at >= t)
|
|
364
|
+
n += b;
|
|
365
|
+
return n;
|
|
366
|
+
}
|
|
367
|
+
/** Whether a later write to a key in the next pack waits behind it. */
|
|
368
|
+
get behind() {
|
|
369
|
+
return this.blocked > 0;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
exports.Arrivals = Arrivals;
|
|
373
|
+
/**
|
|
374
|
+
* The saves' packs in flight, and when each is expected back (28.25 point 2): the callers blocked in a pack will very
|
|
375
|
+
* likely save again once it commits, so its bytes count as coming arrivals.
|
|
376
|
+
*
|
|
377
|
+
* Expected back, by phase: not uploading yet, now plus its sending time plus a commit's usual time; uploading, from the
|
|
378
|
+
* upload's start; sent, the send plus a commit's usual time (the median of the last COMMIT_SAMPLES commits,
|
|
379
|
+
* COMMIT_USUAL_START_MS until one is measured). Before any speed is measured, every pack counts as coming: at worst a
|
|
380
|
+
* save waits the time limit.
|
|
381
|
+
*
|
|
382
|
+
* A pack that committed keeps counting for a grace time (the observe time), less the bytes that arrived since it came
|
|
383
|
+
* back: its callers are on their way back, and between its commit and their saves it is neither in flight nor waiting (a
|
|
384
|
+
* small group waiting for it would otherwise go alone just before them). Times are passed in (ms).
|
|
385
|
+
*/
|
|
386
|
+
class InFlight {
|
|
387
|
+
packs = new Map();
|
|
388
|
+
commits = [];
|
|
389
|
+
/** Committed packs within their grace time: bucket, stored bytes, when it came back. */
|
|
390
|
+
returned = [];
|
|
391
|
+
get size() {
|
|
392
|
+
return this.packs.size;
|
|
393
|
+
}
|
|
394
|
+
add(key, bucket, stored) {
|
|
395
|
+
this.packs.set(key, { bucket, stored });
|
|
396
|
+
}
|
|
397
|
+
/** Its upload starts (again: a pack sent once more starts over). */
|
|
398
|
+
uploading(key, now) {
|
|
399
|
+
const e = this.packs.get(key);
|
|
400
|
+
if (e) {
|
|
401
|
+
e.up = now;
|
|
402
|
+
e.sent = undefined;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/** Its upload ended; its commit is being checked. */
|
|
406
|
+
sent(key, now) {
|
|
407
|
+
const e = this.packs.get(key);
|
|
408
|
+
if (e)
|
|
409
|
+
e.sent = now;
|
|
410
|
+
}
|
|
411
|
+
/** It left: a committed pack's time since its send is a commit's time, and it starts its grace time. */
|
|
412
|
+
remove(key, now, committed) {
|
|
413
|
+
const e = this.packs.get(key);
|
|
414
|
+
if (!e)
|
|
415
|
+
return;
|
|
416
|
+
this.packs.delete(key);
|
|
417
|
+
if (!committed)
|
|
418
|
+
return;
|
|
419
|
+
if (e.sent !== undefined) {
|
|
420
|
+
this.commits.push(Math.max(0, now - e.sent));
|
|
421
|
+
if (this.commits.length > exports.COMMIT_SAMPLES)
|
|
422
|
+
this.commits.shift();
|
|
423
|
+
}
|
|
424
|
+
this.returned.push([e.bucket, e.stored, now]);
|
|
425
|
+
}
|
|
426
|
+
/** The median of the last commits' times (ms). */
|
|
427
|
+
commitUsual() {
|
|
428
|
+
if (!this.commits.length)
|
|
429
|
+
return exports.COMMIT_USUAL_START_MS;
|
|
430
|
+
const s = [...this.commits].sort((a, b) => a - b);
|
|
431
|
+
const m = s.length >> 1;
|
|
432
|
+
return s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2;
|
|
433
|
+
}
|
|
434
|
+
/** When the pack is expected back (ms); now before any speed is measured. speed is in bytes per second. */
|
|
435
|
+
expected(key, now, speed) {
|
|
436
|
+
const e = this.packs.get(key);
|
|
437
|
+
const usual = this.commitUsual();
|
|
438
|
+
if (e.sent !== undefined)
|
|
439
|
+
return e.sent + usual;
|
|
440
|
+
if (!speed || speed <= 0)
|
|
441
|
+
return now;
|
|
442
|
+
return (e.up ?? now) + (e.stored / speed) * 1000 + usual;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* The stored bytes of bucket's packs expected back by by, and of those that came back within graceMs of now less what
|
|
446
|
+
* arrived since (arrivedSince(t): the stored bytes that arrived at t or later).
|
|
447
|
+
*/
|
|
448
|
+
coming(bucket, by, now, speed, graceMs = 0, arrivedSince) {
|
|
449
|
+
this.returned = this.returned.filter(([, , at]) => now < at + graceMs);
|
|
450
|
+
let ahead = 0;
|
|
451
|
+
for (const [k, e] of this.packs)
|
|
452
|
+
if (e.bucket === bucket && this.expected(k, now, speed) <= by)
|
|
453
|
+
ahead += e.stored;
|
|
454
|
+
const back = this.returned.filter(([b]) => b === bucket);
|
|
455
|
+
if (back.length) {
|
|
456
|
+
const since = Math.min(...back.map(([, , at]) => at));
|
|
457
|
+
const arrived = arrivedSince ? arrivedSince(since) : 0;
|
|
458
|
+
ahead += Math.max(0, back.reduce((n, [, s]) => n + s, 0) - arrived);
|
|
459
|
+
}
|
|
460
|
+
return ahead;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
exports.InFlight = InFlight;
|
|
464
|
+
/**
|
|
465
|
+
* The most stored bytes a save's pack may reach by taking its remnant (28.25): the ceiling plus the floor, never past
|
|
466
|
+
* what the measured speed sends in one request's time (28.7), nor the pack cap. l are the server's, before the speed's
|
|
467
|
+
* clamp.
|
|
468
|
+
*/
|
|
469
|
+
function absorbCap(l, requestBytes) {
|
|
470
|
+
const cap = Math.min(l.ceiling + l.floor, exports.MAX_PACK_BYTES);
|
|
471
|
+
return requestBytes === undefined ? cap : Math.min(cap, requestBytes);
|
|
472
|
+
}
|
|
473
|
+
exports.absorbCap = absorbCap;
|
|
474
|
+
/**
|
|
475
|
+
* Whether what a full save's pack turns away is a remnant with nothing coming for it (28.25): its rest stored bytes,
|
|
476
|
+
* plus coming, plus its own arrivals in the window (without its oldest's) at their rate for the time its oldest has
|
|
477
|
+
* left, stay under the floor. The batch that is going is no evidence for it. Decided when the pack goes, never after a
|
|
478
|
+
* wait.
|
|
479
|
+
*/
|
|
480
|
+
function remnantAlone(rest, oldest, arrivals, coming, now, l) {
|
|
481
|
+
if (rest <= 0 || rest >= l.floor)
|
|
482
|
+
return false;
|
|
483
|
+
let recent = 0;
|
|
484
|
+
for (const [t, b] of arrivals)
|
|
485
|
+
if (t > now - l.windowMs)
|
|
486
|
+
recent += b;
|
|
487
|
+
const rate = l.windowMs > 0 ? recent / l.windowMs : 0;
|
|
488
|
+
const left = Math.max(0, oldest + l.waitMs - now);
|
|
489
|
+
return rest + coming + rate * left < l.floor;
|
|
490
|
+
}
|
|
491
|
+
exports.remnantAlone = remnantAlone;
|
|
492
|
+
/**
|
|
493
|
+
* One dispatch (28.17's driver, 28.25): every bucket's decision, oldest bucket first. Returns the packs that may go now,
|
|
494
|
+
* in that order (the driver gives each a slot and memory, or holds it), and the earliest time a waiting one next needs a
|
|
495
|
+
* decision.
|
|
496
|
+
*
|
|
497
|
+
* A bucket's pack is planned only when its totals are at the floor, over the request budget, or it goes (28.22 point 6).
|
|
498
|
+
* A bucket under the floor is contested while another bucket's totals are at the floor or over the budget (a full, ready
|
|
499
|
+
* or request-limited pack waits or settles), or a run's next pack waits for a slot. planOf(arrivals, tailCap) plans a
|
|
500
|
+
* bucket's next pack, with its tail taken within tailCap bytes when given. A full pack that goes takes its remnant
|
|
501
|
+
* (remnantAlone) within cap (absorbCap; 0 takes none).
|
|
502
|
+
*/
|
|
503
|
+
function schedule(queues, now, l, planOf, comingOf, runsWaiting, cap = 0) {
|
|
504
|
+
const order = [...queues.entries()].filter(([, a]) => a.size > 0).sort((x, y) => x[1].oldest()[1] - y[1].oldest()[1]);
|
|
505
|
+
const budget = requestBudget(l);
|
|
506
|
+
const pending = new Set(order.filter(([, a]) => a.waiting >= l.floor || a.request > budget).map(([b]) => b));
|
|
507
|
+
const out = [];
|
|
508
|
+
let next;
|
|
509
|
+
for (const [bucket, a] of order) {
|
|
510
|
+
const oldest = a.oldest()[1];
|
|
511
|
+
const recent = a.arrivals(now, l.windowMs);
|
|
512
|
+
const coming = comingOf(bucket, oldest + l.waitMs);
|
|
513
|
+
const contested = runsWaiting || [...pending].some((b) => b !== bucket);
|
|
514
|
+
const behind = a.behind;
|
|
515
|
+
let plan;
|
|
516
|
+
let d;
|
|
517
|
+
if (!pending.has(bucket)) {
|
|
518
|
+
d = decide('under', a.waiting, oldest, a.last, recent, now, l, true, coming, contested, behind);
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
plan = planOf(a, undefined);
|
|
522
|
+
d = decide(plan.state, plan.stored, oldest, a.last, recent, now, l, true, coming, contested, behind);
|
|
523
|
+
}
|
|
524
|
+
if (d.kind === 'send' && !plan) {
|
|
525
|
+
plan = planOf(a, undefined);
|
|
526
|
+
if (plan.state !== 'under')
|
|
527
|
+
d = decide(plan.state, plan.stored, oldest, a.last, recent, now, l, true, coming, contested, behind); // decided again from the planned pack
|
|
528
|
+
}
|
|
529
|
+
if (d.kind === 'wait') {
|
|
530
|
+
next = next === undefined ? d.at : Math.min(next, d.at);
|
|
531
|
+
continue;
|
|
532
|
+
}
|
|
533
|
+
if (!plan)
|
|
534
|
+
continue;
|
|
535
|
+
if (d.kind === 'send' && plan.state === 'full' && plan.rest.length > 0 && cap > 0) {
|
|
536
|
+
const since = a.arrivedAt(plan.rest[0]);
|
|
537
|
+
const own = plan.rest.slice(1).map((it) => [a.arrivedAt(it), a.storedOf(it)]);
|
|
538
|
+
if (remnantAlone(a.waiting - plan.stored, since, own, comingOf(bucket, since + l.waitMs), now, l)) {
|
|
539
|
+
const whole = planOf(a, cap);
|
|
540
|
+
if (!whole.rest.length && whole.stored >= l.floor)
|
|
541
|
+
plan = whole;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
out.push({ bucket, plan, decision: d });
|
|
545
|
+
}
|
|
546
|
+
return [out, next];
|
|
547
|
+
}
|
|
548
|
+
exports.schedule = schedule;
|
|
549
|
+
//# sourceMappingURL=packing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packing.js","sourceRoot":"","sources":["../../../src/direct/packing.ts"],"names":[],"mappings":"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"}
|