@mark1russell7/harness 0.14.2 → 0.14.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 +42 -5
- package/build/{cell-BccWKiXh.d.ts → cell-DZm8zXN4.d.ts} +354 -10
- package/build/{image-Lg8LL6C3.js → image-EZ8ioZ3L.js} +161 -11
- package/build/image-EZ8ioZ3L.js.map +1 -0
- package/build/index.d.ts +742 -107
- package/build/index.js +2403 -164
- package/build/index.js.map +1 -1
- package/build/schema.d.ts +1 -1
- package/build/schema.js +1 -1
- package/image/Dockerfile +1 -1
- package/image/amqp/client-cluster.mjs +68 -31
- package/image/hikari/ClientHikari.java +81 -6
- package/image/kafka/AdminKafka.java +117 -0
- package/image/kafka/ClientKafka.java +234 -0
- package/image/kafka/Dockerfile +23 -0
- package/image/kafka/jars.sha256 +5 -0
- package/image/mongo/client-mongo.mjs +5 -3
- package/image/native/src/bin/inject.rs +40 -13
- package/image/native/src/bin/ports.rs +374 -0
- package/image/native/src/bin/queue.rs +553 -0
- package/image/node/client-sentinel.mjs +28 -12
- package/image/pg/client-pg.mjs +31 -4
- package/package.json +5 -1
- package/build/image-Lg8LL6C3.js.map +0 -1
|
@@ -59,8 +59,13 @@ import { KernelRecord } from "@mark1russell7/prober";
|
|
|
59
59
|
* - `drain` puts the node of the part in maintenance mode: `rabbitmq-upgrade drain`. The node closes the
|
|
60
60
|
* connections of its clients, and it moves the leadership of each of its queues to another node.
|
|
61
61
|
* `rabbitmq-upgrade revive` ends it after the run.
|
|
62
|
+
*
|
|
63
|
+
* This fault is of a fabric (`Topology.fabric`):
|
|
64
|
+
* - `silence` drops each packet of spine1 in one commit, and its links stay up. Each leaf loses its
|
|
65
|
+
* neighbor only by a detector of its own, and the routes move to spine2. The measured move ends
|
|
66
|
+
* the stall of the client (`Run.heal`).
|
|
62
67
|
*/
|
|
63
|
-
type Fault = "blackhole" | "freeze-process" | "rst" | "stall" | "fin" | "unreachable" | "simplex" | "mtu-blackhole" | "netem" | "middlebox-forget" | "proxy-idle" | "toxic" | "server-close" | "partition" | "planned-failover" | "app-stall" | "step-down" | "drain" | "hop-event" | "none";
|
|
68
|
+
type Fault = "blackhole" | "freeze-process" | "rst" | "stall" | "fin" | "unreachable" | "simplex" | "mtu-blackhole" | "netem" | "middlebox-forget" | "proxy-idle" | "toxic" | "server-close" | "partition" | "planned-failover" | "app-stall" | "step-down" | "drain" | "hop-event" | "silence" | "none";
|
|
64
69
|
/**
|
|
65
70
|
* A middlebox form tells what a router does with a flow that it forgot, when a late packet comes:
|
|
66
71
|
* - `reset-both` sends a reset to the two ends when it forgets the flow.
|
|
@@ -185,13 +190,33 @@ interface HopWrite {
|
|
|
185
190
|
* of the side of the client, and the network of the side of the target.
|
|
186
191
|
*/
|
|
187
192
|
type Hop = RouterHop | ProxyHop;
|
|
193
|
+
/**
|
|
194
|
+
* A fabric is a routed network on layer E3 (`fabric.ts`), by its timers. The detector of a fabric
|
|
195
|
+
* is the BGP hold timer, or BFD when it has `bfd`.
|
|
196
|
+
*/
|
|
197
|
+
interface Fabric {
|
|
198
|
+
readonly keepalive: Quantity;
|
|
199
|
+
readonly hold: Quantity;
|
|
200
|
+
/** These are the receive and transmit interval and the multiplier of BFD, or null for no BFD. */
|
|
201
|
+
readonly bfd: {
|
|
202
|
+
readonly interval: Quantity;
|
|
203
|
+
readonly multiplier: number;
|
|
204
|
+
} | null;
|
|
205
|
+
}
|
|
206
|
+
/** A fabric manifest tells what a fabric ran on: its timers, its image and containerlab. */
|
|
207
|
+
interface FabricManifest extends Fabric {
|
|
208
|
+
readonly image: string;
|
|
209
|
+
readonly containerlab: string;
|
|
210
|
+
}
|
|
188
211
|
/**
|
|
189
212
|
* A topology is the chain of hops between the client and the target, in sequence from the client.
|
|
190
|
-
* Without hops, the client and the target are a direct pair.
|
|
213
|
+
* Without hops, the client and the target are a direct pair. With `fabric`, a routed network
|
|
214
|
+
* joins them, and the chain of hops is empty.
|
|
191
215
|
*/
|
|
192
216
|
interface Topology {
|
|
193
217
|
readonly name: string;
|
|
194
218
|
readonly hops: readonly Hop[];
|
|
219
|
+
readonly fabric?: Fabric;
|
|
195
220
|
}
|
|
196
221
|
/**
|
|
197
222
|
* A group is a replicated group under an external failover authority, as data. It is a primary and
|
|
@@ -257,6 +282,28 @@ interface ReplicaSet {
|
|
|
257
282
|
/** This line tells that a member serves. */
|
|
258
283
|
readonly ready: string;
|
|
259
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* A drill is a recovery drill of a replica set cell, as data. The store gets generated data for
|
|
287
|
+
* each tenant and real backups while a client writes. Then the fault removes the disk of a member,
|
|
288
|
+
* or of each member, and the store recovers. A drill shortens the interval of the backups. The
|
|
289
|
+
* loss of a backup depends on the age of the newest backup at the fault, and `age` sets that age.
|
|
290
|
+
*/
|
|
291
|
+
interface Drill {
|
|
292
|
+
/** This count is the number of tenants. The size of the store follows it. */
|
|
293
|
+
readonly tenants: number;
|
|
294
|
+
/** This size is the generated data of one tenant. */
|
|
295
|
+
readonly perTenant: Quantity;
|
|
296
|
+
/** This count is the number of slices of the oplog after the dump. */
|
|
297
|
+
readonly slices: number;
|
|
298
|
+
/** This time is the interval from the dump to the first slice, and between two slices. */
|
|
299
|
+
readonly sliceEvery: Quantity;
|
|
300
|
+
/** This time is the age of the newest backup at the fault: from its last write, or from its end in the control. */
|
|
301
|
+
readonly age: Quantity;
|
|
302
|
+
/** This word tells how the store recovers. An election follows the loss of the disk of the primary. A restore from the backups follows the loss of each disk. */
|
|
303
|
+
readonly recovery: "election" | "restore";
|
|
304
|
+
/** This flag makes the drill a control: the client stops before the dump, thus no write comes after it. */
|
|
305
|
+
readonly quiet?: true;
|
|
306
|
+
}
|
|
260
307
|
/**
|
|
261
308
|
* A cluster is a cluster of RabbitMQ nodes with one quorum queue, as data. The members of the queue
|
|
262
309
|
* elect its leader by Raft, one member on each node. Each node is a container from the same stock
|
|
@@ -284,6 +331,36 @@ interface Cluster {
|
|
|
284
331
|
readonly start: string;
|
|
285
332
|
};
|
|
286
333
|
}
|
|
334
|
+
/**
|
|
335
|
+
* A Kafka group is a group of brokers of Apache Kafka in KRaft mode with one controller, as data.
|
|
336
|
+
* Each node is a container from the same stock image, pinned by digest, in its own network namespace.
|
|
337
|
+
* Each run makes one new topic with one partition, with a replica on each broker. The client is the
|
|
338
|
+
* producer of kafka-clients, and it writes a stream of sequence numbers to that partition.
|
|
339
|
+
* The one controller keeps a Raft election out of each run. A fault on a broker cuts it from the
|
|
340
|
+
* controller too, and no fault acts on the controller.
|
|
341
|
+
*/
|
|
342
|
+
interface Kafka {
|
|
343
|
+
/** This image is the stock image of each node, pinned by digest. */
|
|
344
|
+
readonly image: string;
|
|
345
|
+
/** These are the names of the brokers. A broker's node id is its place in this list, from 1. The first broker is the first leader. */
|
|
346
|
+
readonly brokers: readonly string[];
|
|
347
|
+
/** This name is the name of the controller. Its node id comes after the ids of the brokers. */
|
|
348
|
+
readonly controller: string;
|
|
349
|
+
readonly port: number;
|
|
350
|
+
readonly controllerPort: number;
|
|
351
|
+
/** This text is the id of the cluster: 16 bytes in base64url without padding. */
|
|
352
|
+
readonly clusterId: string;
|
|
353
|
+
/** This text is the value of KAFKA_HEAP_OPTS of each node. */
|
|
354
|
+
readonly heap: string;
|
|
355
|
+
/** These are server properties of each node, by their names in Kafka: for example `broker.session.timeout.ms`. */
|
|
356
|
+
readonly settings: Readonly<Record<string, string>>;
|
|
357
|
+
/** This line tells that a node serves. */
|
|
358
|
+
readonly ready: string;
|
|
359
|
+
/** This count is the setting `min.insync.replicas` of the topic of each run. */
|
|
360
|
+
readonly minInsync: number;
|
|
361
|
+
/** This count is the number of writers of the client, each with one write at a time. */
|
|
362
|
+
readonly writers: number;
|
|
363
|
+
}
|
|
287
364
|
/**
|
|
288
365
|
* A cluster stage is one step of the timeline of a cluster after a fault. A line of the log of a
|
|
289
366
|
* node marks it, or a line of the client. These are the stages:
|
|
@@ -305,10 +382,12 @@ type GroupRole = "primary" | "replica" | "sentinel";
|
|
|
305
382
|
* - `clients`: the clients, but not the group.
|
|
306
383
|
* - `one`: one other member, in both directions.
|
|
307
384
|
* - `one-way`: one other member, for the segments from the part only.
|
|
385
|
+
* - `to-clients`: the clients, for the segments from the part only. Each write of a client reaches
|
|
386
|
+
* the part, and no reply reaches the client.
|
|
308
387
|
*/
|
|
309
388
|
interface GroupPlace {
|
|
310
389
|
readonly role: GroupRole;
|
|
311
|
-
readonly cuts?: "all" | "group" | "clients" | "one" | "one-way";
|
|
390
|
+
readonly cuts?: "all" | "group" | "clients" | "one" | "one-way" | "to-clients";
|
|
312
391
|
}
|
|
313
392
|
/** A toxic is one toxic of Toxiproxy, as its API takes it. Its toxicity is 1. */
|
|
314
393
|
interface Toxic {
|
|
@@ -432,6 +511,9 @@ interface StageBand {
|
|
|
432
511
|
* - `lost` is the band of the count of accepted writes that the group did not keep, in each run. A
|
|
433
512
|
* count outside it is a finding. A measurement-only cell with this band gets its decision from
|
|
434
513
|
* the findings of its runs, thus the law of the count judges the cell.
|
|
514
|
+
* - `duplicates` is the band of the count of extra copies that the group holds, in each run. It
|
|
515
|
+
* judges a cell as `lost` does. Only a list or a log can show a copy, thus a Redis cell needs
|
|
516
|
+
* `op: "rpush"`.
|
|
435
517
|
*/
|
|
436
518
|
interface GroupPrediction {
|
|
437
519
|
readonly lands: "new" | "same";
|
|
@@ -448,6 +530,51 @@ interface GroupPrediction {
|
|
|
448
530
|
readonly low: number;
|
|
449
531
|
readonly high: number;
|
|
450
532
|
};
|
|
533
|
+
readonly duplicates?: {
|
|
534
|
+
readonly low: number;
|
|
535
|
+
readonly high: number;
|
|
536
|
+
};
|
|
537
|
+
/** These are the bands of the commits of a pair (`Cell.pair`), each by its set. A set with no band is a measurement. */
|
|
538
|
+
readonly outcomes?: Outcomes;
|
|
539
|
+
}
|
|
540
|
+
/** A count band is the least and the most of a count, both included. */
|
|
541
|
+
interface CountBand {
|
|
542
|
+
readonly low: number;
|
|
543
|
+
readonly high: number;
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* These are the bands of the sets of a pair. A commit with no reply is in one set, by the two final reads:
|
|
547
|
+
* - `kept`: the new primary holds it.
|
|
548
|
+
* - `stranded`: only the old primary holds it, after its crash recovery.
|
|
549
|
+
* - `absent`: no server holds it.
|
|
550
|
+
*/
|
|
551
|
+
interface Outcomes {
|
|
552
|
+
/** This band is the count of the writes with no reply, of each set. */
|
|
553
|
+
readonly unknown?: CountBand;
|
|
554
|
+
readonly kept?: CountBand;
|
|
555
|
+
readonly stranded?: CountBand;
|
|
556
|
+
readonly absent?: CountBand;
|
|
557
|
+
/** This band is the count of the acknowledged writes that the old primary does not hold after its crash recovery. */
|
|
558
|
+
readonly missing?: CountBand;
|
|
559
|
+
/** This band is the count of the WARNING notices that the client reads. */
|
|
560
|
+
readonly warnings?: CountBand;
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* A pair is a PostgreSQL primary, the target of a cell, and one standby on its network. The topology
|
|
564
|
+
* of the cell stays in front of the primary. Nothing in the pair fails over by itself: the harness
|
|
565
|
+
* does each step, in the order of `pairOnce`.
|
|
566
|
+
*/
|
|
567
|
+
interface Pair {
|
|
568
|
+
/** This flag names the standby in `synchronous_standby_names`. Without it, the standby is asynchronous. */
|
|
569
|
+
readonly synchronous: boolean;
|
|
570
|
+
/** This count is the writers of the client, each with its own connection of the pool. */
|
|
571
|
+
readonly writers: number;
|
|
572
|
+
/** This time is the pause of a writer after each reply. */
|
|
573
|
+
readonly interval: Quantity;
|
|
574
|
+
/** This place is what the black hole cuts the primary from: the standby, or each peer. */
|
|
575
|
+
readonly cuts: "standby" | "all";
|
|
576
|
+
/** This count is the cancels of the waits of the primary, spread across the hold. */
|
|
577
|
+
readonly cancels?: number;
|
|
451
578
|
}
|
|
452
579
|
/**
|
|
453
580
|
* A middlebox expectation tells what the router of a topology does with the flow in the window of
|
|
@@ -486,6 +613,16 @@ interface LineMatch {
|
|
|
486
613
|
readonly where?: Readonly<Record<string, string | number | boolean>>;
|
|
487
614
|
readonly name?: string;
|
|
488
615
|
}
|
|
616
|
+
/**
|
|
617
|
+
* A line count is an exact count of the lines of the target in one run, for a cell whose law gives a
|
|
618
|
+
* count (SYS-67). A count reads no timer, thus it has no band and no noise. The judge compares it with
|
|
619
|
+
* `count`, and `what` names it in the finding.
|
|
620
|
+
*/
|
|
621
|
+
interface LineCount {
|
|
622
|
+
readonly what: string;
|
|
623
|
+
readonly match: LineMatch;
|
|
624
|
+
readonly count: number;
|
|
625
|
+
}
|
|
489
626
|
/**
|
|
490
627
|
* A driver step is one more band of a driver after the band of its cell. An example is the error
|
|
491
628
|
* of the retry after the interruption. It has its own reference on a socket of the driver, its
|
|
@@ -637,7 +774,120 @@ type Prediction = {
|
|
|
637
774
|
* the client. The end has no band, but each wait has one. A wait outside its band is a finding of its run.
|
|
638
775
|
*/
|
|
639
776
|
readonly reconnects?: Reconnects;
|
|
777
|
+
/**
|
|
778
|
+
* These are the exact counts of the lines of the target in each run. A count that differs is a
|
|
779
|
+
* finding of its run. A measurement-only cell with a reference and counts gets a decision from them.
|
|
780
|
+
*/
|
|
781
|
+
readonly counts?: readonly LineCount[];
|
|
782
|
+
/**
|
|
783
|
+
* This record is the law of an accept queue: its limit, its count, its counters, and what each
|
|
784
|
+
* connection sees. A value outside it is a finding of its run.
|
|
785
|
+
*/
|
|
786
|
+
readonly queue?: QueuePrediction;
|
|
787
|
+
/**
|
|
788
|
+
* This record is the law of a port range: the count of connects, the ports that they use, and
|
|
789
|
+
* when a held port comes back. A value outside it is a finding of its run.
|
|
790
|
+
*/
|
|
791
|
+
readonly ports?: PortsPrediction;
|
|
640
792
|
};
|
|
793
|
+
/** A queue band is a time from one line of a queue cell to another line, with its two bounds. */
|
|
794
|
+
interface QueueBand {
|
|
795
|
+
readonly low: Quantity;
|
|
796
|
+
readonly high: Quantity;
|
|
797
|
+
}
|
|
798
|
+
/** This prediction tells how one connection of a queue cell ends. */
|
|
799
|
+
interface QueueEnd {
|
|
800
|
+
readonly errno: string;
|
|
801
|
+
/** This name is the line of the connection that the time of the end counts from. */
|
|
802
|
+
readonly from: "dial" | "connected" | "sent";
|
|
803
|
+
readonly within: QueueBand;
|
|
804
|
+
/**
|
|
805
|
+
* This band is the time from the last retransmission of the connection to its end. With an
|
|
806
|
+
* `expiry`, the retransmission before the last comes before the expiry, and the last comes after it.
|
|
807
|
+
*/
|
|
808
|
+
readonly retransmitted?: QueueBand;
|
|
809
|
+
}
|
|
810
|
+
/** This prediction tells what one connection of a queue cell sees, by its name in the client. */
|
|
811
|
+
interface QueueConnection {
|
|
812
|
+
readonly name: string;
|
|
813
|
+
/** This choice says if the connect of the connection succeeds. */
|
|
814
|
+
readonly connects: boolean;
|
|
815
|
+
/** These bands are the waits of the SYN: the first from the dial, each next one from the SYN before it. */
|
|
816
|
+
readonly syns?: readonly QueueBand[];
|
|
817
|
+
/** These bands are the waits of each SYN-ACK sent again: the first from the dial, each next one from the SYN-ACK before it. */
|
|
818
|
+
readonly synAcks?: readonly QueueBand[];
|
|
819
|
+
/** This prediction tells how the connection ends. It is null for a connection that lives to the end of the run. */
|
|
820
|
+
readonly ends: QueueEnd | null;
|
|
821
|
+
/** This count is the segments that the peer has not acknowledged at the end of the run. */
|
|
822
|
+
readonly unacked?: number;
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* This prediction is the law of an accept queue. It reads the lines of the queue client and of the
|
|
826
|
+
* queue target. The counters count from the `opened` line of the run.
|
|
827
|
+
*/
|
|
828
|
+
interface QueuePrediction {
|
|
829
|
+
/** This count is the limit of the queue: `sk_max_ack_backlog`, as TCP_INFO of the listener gives it. */
|
|
830
|
+
readonly max: number;
|
|
831
|
+
/** This count is the most connections that the queue holds at one time. */
|
|
832
|
+
readonly held: number;
|
|
833
|
+
/** This count is the connections that connect, and the kernel of the client tells this. */
|
|
834
|
+
readonly connected: number;
|
|
835
|
+
/** These counts are the bounds of `ListenOverflows`. */
|
|
836
|
+
readonly overflows: {
|
|
837
|
+
readonly low: number;
|
|
838
|
+
readonly high: number;
|
|
839
|
+
};
|
|
840
|
+
/** This count is `EmbryonicRsts`: the handshakes that the target reset. */
|
|
841
|
+
readonly resets: number;
|
|
842
|
+
/** These predictions are the connections with a law of their own. */
|
|
843
|
+
readonly connections: readonly QueueConnection[];
|
|
844
|
+
/** A run where this connection did not take the last place in the queue is void: its burst did not land in its sequence. */
|
|
845
|
+
readonly admitted?: string;
|
|
846
|
+
/** This record tells when the kernel of the target forgets the handshakes: the `TCPTimeouts` of their last firings, from the first dial of the burst. */
|
|
847
|
+
readonly expiry?: {
|
|
848
|
+
readonly timeouts: number;
|
|
849
|
+
readonly within: QueueBand;
|
|
850
|
+
};
|
|
851
|
+
/** This record tells when the count of the queue gets back to `count`, from the first dial of the burst, after an accept. */
|
|
852
|
+
readonly rise?: {
|
|
853
|
+
readonly count: number;
|
|
854
|
+
readonly within: QueueBand;
|
|
855
|
+
};
|
|
856
|
+
/** This count is the connections that the target accepted in the run. */
|
|
857
|
+
readonly drained?: number;
|
|
858
|
+
}
|
|
859
|
+
/**
|
|
860
|
+
* This prediction is the law of a port range. It reads the lines of the ports client. In each round
|
|
861
|
+
* the client connects to each destination until a connect fails with EADDRNOTAVAIL.
|
|
862
|
+
*/
|
|
863
|
+
interface PortsPrediction {
|
|
864
|
+
/** This port is the low end of the range. */
|
|
865
|
+
readonly low: number;
|
|
866
|
+
/** This count is the ports of the range. */
|
|
867
|
+
readonly size: number;
|
|
868
|
+
/** This count is the rounds of each run. */
|
|
869
|
+
readonly rounds: number;
|
|
870
|
+
/** This count is the destinations of each round. */
|
|
871
|
+
readonly destinations: number;
|
|
872
|
+
/** These counts are the only connects that one destination can get in one round. */
|
|
873
|
+
readonly counts: readonly number[];
|
|
874
|
+
/** These offsets from the low port are the only ports that the run uses. It uses each of them. */
|
|
875
|
+
readonly seen: readonly number[];
|
|
876
|
+
/** This time is the longest connect that fails. */
|
|
877
|
+
readonly refusedWithin: Quantity;
|
|
878
|
+
/** This record is the band of the share of the rounds that get `count` connects. */
|
|
879
|
+
readonly share?: {
|
|
880
|
+
readonly count: number;
|
|
881
|
+
readonly low: number;
|
|
882
|
+
readonly high: number;
|
|
883
|
+
};
|
|
884
|
+
/** This choice says that the ports of the parity of the low port come first in each round. */
|
|
885
|
+
readonly lowFirst?: boolean;
|
|
886
|
+
/** This band is the time from the `closing` line to each `freed` line: when each held port comes back. */
|
|
887
|
+
readonly freed?: QueueBand;
|
|
888
|
+
/** This count is the segments that the sockets of the client send again. */
|
|
889
|
+
readonly retransmissions?: number;
|
|
890
|
+
}
|
|
641
891
|
/** A target is the server that a cell connects to: a stock image. */
|
|
642
892
|
interface Target {
|
|
643
893
|
/** This image is a stock image, pinned by digest. */
|
|
@@ -693,7 +943,7 @@ interface Target {
|
|
|
693
943
|
* grpc-go and `etcd` is etcd on Alpine: each is a subject of a target (`Target.subject`).
|
|
694
944
|
* `docker-proxy` is the userland proxy of Docker Engine 29.1.5, the program of a proxy hop.
|
|
695
945
|
*/
|
|
696
|
-
type Shipped = "harness" | "node" | "go-http" | "node-http" | "mongo" | "pg" | "hikari" | "amqp" | "grpc" | "grpc-go" | "etcd" | "router" | "pgbouncer" | "pgpool" | "docker-proxy";
|
|
946
|
+
type Shipped = "harness" | "node" | "go-http" | "node-http" | "mongo" | "pg" | "hikari" | "amqp" | "kafka" | "grpc" | "grpc-go" | "etcd" | "router" | "pgbouncer" | "pgpool" | "docker-proxy";
|
|
697
947
|
/**
|
|
698
948
|
* An image source tells where an image comes from, as data. The harness resolves each kind to an
|
|
699
949
|
* image that it can start:
|
|
@@ -865,19 +1115,26 @@ interface Cell {
|
|
|
865
1115
|
/**
|
|
866
1116
|
* This driver replaces the TCP client of the harness, with its own options. The driver then
|
|
867
1117
|
* ignores `keepalive` and `userTimeout`:
|
|
868
|
-
* - ioredis 6 on Node, whose keepAlive is the keepalive delay of the socket.
|
|
1118
|
+
* - ioredis 6 on Node, whose keepAlive is the keepalive delay of the socket. In a group cell,
|
|
1119
|
+
* its write is `SET w:<n> <n>`, or `RPUSH w <n>` with `op: "rpush"`, thus a list keeps each
|
|
1120
|
+
* copy. `window` is the count of writers, each with one write in flight: 1 at the default.
|
|
869
1121
|
* - the MongoDB driver on Node, against the replica set `set`. Its operation is a write, or
|
|
870
1122
|
* the read of a long document (`read-long`). `Cell.driverOptions` are its options.
|
|
871
1123
|
* - node-postgres on Node, as a `pg.Pool` against one server. Its operation is `query`, or
|
|
872
1124
|
* `SELECT 1`. `Cell.driverOptions` are the options of its pool.
|
|
873
1125
|
* - HikariCP over pgjdbc on Java, as a `HikariDataSource` against one server. Its operation is
|
|
874
|
-
* `query`, or `SELECT 1`. `Cell.driverOptions` are the properties of HikariConfig
|
|
875
|
-
* with the prefix `dataSource.` is a property of pgjdbc
|
|
1126
|
+
* `query`, or `SELECT 1`. `Cell.driverOptions` are the properties of HikariConfig. A name
|
|
1127
|
+
* with the prefix `dataSource.` is a property of pgjdbc, and a name with the prefix `system.`
|
|
1128
|
+
* is a system property of the JVM.
|
|
876
1129
|
*
|
|
877
1130
|
* A pg or hikari driver can send a different text in flight (`inflight`): the second query of
|
|
878
1131
|
* an in-flight run. The first query then makes the pool ready at once, and only the query in
|
|
879
1132
|
* flight is slow, for example `SELECT pg_sleep(20)`.
|
|
880
1133
|
*
|
|
1134
|
+
* A hikari driver can send a burst in place of one query in flight. A burst is `count` queries,
|
|
1135
|
+
* query 2 and the next ones. Each one has its own thread, and it starts `gap` after the one before
|
|
1136
|
+
* it. The client writes a `burst` line at the end of the last one, with its counts.
|
|
1137
|
+
*
|
|
881
1138
|
* A grpc driver is grpc-js on Node, with one channel. Its operation is a unary call of
|
|
882
1139
|
* grpc.health.v1.Health/Check. `Cell.driverOptions` are its channel options (`grpc.*`) and
|
|
883
1140
|
* `deadline_ms`. With `hold`, the call in flight asks the server of the harness to hold its reply
|
|
@@ -886,6 +1143,8 @@ interface Cell {
|
|
|
886
1143
|
readonly driver?: {
|
|
887
1144
|
readonly name: "ioredis";
|
|
888
1145
|
readonly keepAlive: Quantity;
|
|
1146
|
+
readonly op?: "set" | "rpush";
|
|
1147
|
+
readonly window?: number;
|
|
889
1148
|
} | {
|
|
890
1149
|
readonly name: "mongodb";
|
|
891
1150
|
readonly set: string;
|
|
@@ -898,6 +1157,10 @@ interface Cell {
|
|
|
898
1157
|
readonly name: "hikari";
|
|
899
1158
|
readonly query?: string;
|
|
900
1159
|
readonly inflight?: string;
|
|
1160
|
+
readonly burst?: {
|
|
1161
|
+
readonly count: number;
|
|
1162
|
+
readonly gap: Quantity;
|
|
1163
|
+
};
|
|
901
1164
|
} | {
|
|
902
1165
|
readonly name: "amqp";
|
|
903
1166
|
} | {
|
|
@@ -977,6 +1240,14 @@ interface Cell {
|
|
|
977
1240
|
* record, and the cluster does not read it.
|
|
978
1241
|
*/
|
|
979
1242
|
readonly cluster?: Cluster;
|
|
1243
|
+
/**
|
|
1244
|
+
* This Kafka group replaces the target: brokers of Apache Kafka with one controller. The client is
|
|
1245
|
+
* then the producer of kafka-clients, with the settings of `driverOptions`. `target` stays for the
|
|
1246
|
+
* record, and the group does not read it.
|
|
1247
|
+
*/
|
|
1248
|
+
readonly kafka?: Kafka;
|
|
1249
|
+
/** This pair adds a standby to the target (`Pair`). The client is then node-postgres, in a stream of K writers. */
|
|
1250
|
+
readonly pair?: Pair;
|
|
980
1251
|
/** This place is the node of the client in a cluster: the node of the leader, or of a follower. Without it, the node of a follower. */
|
|
981
1252
|
readonly clientAt?: ClusterClientAt;
|
|
982
1253
|
/**
|
|
@@ -984,6 +1255,11 @@ interface Cell {
|
|
|
984
1255
|
* that instant, on the clock of the VM. On a direct pair, a frozen target thaws after it.
|
|
985
1256
|
*/
|
|
986
1257
|
readonly hold?: Quantity;
|
|
1258
|
+
/**
|
|
1259
|
+
* This time is how much longer a run of a replica set continues after the lift. A prediction of
|
|
1260
|
+
* no failover after a short hold needs it: the run must outlast the timers of an election.
|
|
1261
|
+
*/
|
|
1262
|
+
readonly watch?: Quantity;
|
|
987
1263
|
/** This flag makes a planned failover coordinated: `SENTINEL FAILOVER <group> COORDINATED`. */
|
|
988
1264
|
readonly coordinated?: boolean;
|
|
989
1265
|
/**
|
|
@@ -995,6 +1271,8 @@ interface Cell {
|
|
|
995
1271
|
readonly writeConcern?: "majority" | 1;
|
|
996
1272
|
/** This flag makes the fault hold before the client starts. The client then meets it at its first selection. */
|
|
997
1273
|
readonly before?: boolean;
|
|
1274
|
+
/** This drill makes the cell a recovery drill. It needs `replicaSet`, and its runs have two clients when the store restores. */
|
|
1275
|
+
readonly drill?: Drill;
|
|
998
1276
|
/** This count is the number of runs of the cell (11), across new environments (two at least). */
|
|
999
1277
|
readonly runs: number;
|
|
1000
1278
|
readonly environments: number;
|
|
@@ -1108,6 +1386,12 @@ interface Run {
|
|
|
1108
1386
|
* its window is δ_abs of its cell: 1 ms on a calibrated runner.
|
|
1109
1387
|
*/
|
|
1110
1388
|
readonly jitter?: Jitter;
|
|
1389
|
+
/**
|
|
1390
|
+
* This share is the CPU time from 0 to 1 that the host took from this machine in the run, from
|
|
1391
|
+
* `/proc/stat` (`stealShare`). A run of a plain cell writes it. A group, a replica set or a cluster
|
|
1392
|
+
* writes it with its first cell on layer E4.
|
|
1393
|
+
*/
|
|
1394
|
+
readonly steal?: number;
|
|
1111
1395
|
/** These are the addresses and the namespaces of a topology, which the measurement of a run reads. */
|
|
1112
1396
|
readonly topology?: RunTopology;
|
|
1113
1397
|
/** These are the lines of the routers of a topology from the start to the end of the run. */
|
|
@@ -1116,6 +1400,29 @@ interface Run {
|
|
|
1116
1400
|
readonly group?: RunGroup;
|
|
1117
1401
|
/** These are the lines of a target that writes them (`Target.lines`), from the start to the end of the run. */
|
|
1118
1402
|
readonly server?: readonly ProbeEvent[];
|
|
1403
|
+
/** This record is the fabric of a cell with `Topology.fabric`. */
|
|
1404
|
+
readonly fabric?: RunFabric;
|
|
1405
|
+
}
|
|
1406
|
+
/** A run route is one change of a route at a leaf of a fabric, on the monotonic clock. */
|
|
1407
|
+
interface RunRoute {
|
|
1408
|
+
readonly leaf: string;
|
|
1409
|
+
readonly t: number;
|
|
1410
|
+
readonly deleted: boolean;
|
|
1411
|
+
readonly prefix: string;
|
|
1412
|
+
readonly via: string | null;
|
|
1413
|
+
readonly dev: string | null;
|
|
1414
|
+
}
|
|
1415
|
+
/**
|
|
1416
|
+
* A run fabric is what the routers did in a run. It holds each change of a route. It also holds the
|
|
1417
|
+
* count of established sessions of each leaf at the start and the end. A session that went down and
|
|
1418
|
+
* came back in the run raises its count.
|
|
1419
|
+
*/
|
|
1420
|
+
interface RunFabric {
|
|
1421
|
+
readonly routes: readonly RunRoute[];
|
|
1422
|
+
readonly established: {
|
|
1423
|
+
readonly before: Readonly<Record<string, number>>;
|
|
1424
|
+
readonly after: Readonly<Record<string, number>>;
|
|
1425
|
+
};
|
|
1119
1426
|
}
|
|
1120
1427
|
/** A Sentinel event is one line of the observer of a group: an event that a Sentinel published, on the clock of the VM. */
|
|
1121
1428
|
interface SentinelEvent {
|
|
@@ -1150,8 +1457,45 @@ interface RunGroup {
|
|
|
1150
1457
|
readonly timeline: readonly SentinelEvent[];
|
|
1151
1458
|
/** This name is the member that was the primary when the group converged after the run, or null when it did not converge. */
|
|
1152
1459
|
readonly after: string | null;
|
|
1153
|
-
/** These are the sequence numbers that the group holds after the run, when it converged, or null. */
|
|
1460
|
+
/** These are the sequence numbers that the group holds after the run, one entry for each copy, when it converged, or null. */
|
|
1154
1461
|
readonly holds: readonly number[] | null;
|
|
1462
|
+
/** These are the sequence numbers that the old primary of a pair holds after its crash recovery. */
|
|
1463
|
+
readonly oldHolds?: readonly number[];
|
|
1464
|
+
/** This record tells what a recovery drill did. */
|
|
1465
|
+
readonly drill?: RunDrill;
|
|
1466
|
+
}
|
|
1467
|
+
/** A run backup is one backup of a drill: a dump with its oplog, or one slice of the oplog. */
|
|
1468
|
+
interface RunBackup {
|
|
1469
|
+
readonly kind: "dump" | "slice";
|
|
1470
|
+
/** These are the start and the end of the backup, on the wall clock of the runner, in ms. */
|
|
1471
|
+
readonly started: number;
|
|
1472
|
+
readonly ended: number;
|
|
1473
|
+
/** This write is the last one that the backups hold up to this backup, or null with no write. Its time is the time that the client sent it. */
|
|
1474
|
+
readonly last: {
|
|
1475
|
+
readonly n: number;
|
|
1476
|
+
readonly t: number;
|
|
1477
|
+
} | null;
|
|
1478
|
+
/** This size is the size of the backup on disk. */
|
|
1479
|
+
readonly size: Quantity;
|
|
1480
|
+
}
|
|
1481
|
+
/** A run drill is what a recovery drill did in one run. */
|
|
1482
|
+
interface RunDrill {
|
|
1483
|
+
/** This text is the first line of `mongodump --version`. */
|
|
1484
|
+
readonly tool: string;
|
|
1485
|
+
/** This word tells where the data of the tenants came from. It is always generated data. */
|
|
1486
|
+
readonly seed: "generated";
|
|
1487
|
+
readonly backups: readonly RunBackup[];
|
|
1488
|
+
/** This hash is the hash of the data of the tenants before the first client. */
|
|
1489
|
+
readonly before: string;
|
|
1490
|
+
/** This hash is the hash of the data of the tenants after the run, or null when the set did not converge. */
|
|
1491
|
+
readonly after: string | null;
|
|
1492
|
+
/** These are the start and the end of the restore, on the wall clock of the runner, in ms, or null without a restore. */
|
|
1493
|
+
readonly restored: {
|
|
1494
|
+
readonly started: number;
|
|
1495
|
+
readonly ended: number;
|
|
1496
|
+
} | null;
|
|
1497
|
+
/** This number is the first sequence number of the second client, or null with one client. */
|
|
1498
|
+
readonly second: number | null;
|
|
1155
1499
|
}
|
|
1156
1500
|
/**
|
|
1157
1501
|
* A run topology tells where each socket of a run is, in a topology:
|
|
@@ -1169,5 +1513,5 @@ interface RunTopology {
|
|
|
1169
1513
|
}>>;
|
|
1170
1514
|
}
|
|
1171
1515
|
//#endregion
|
|
1172
|
-
export {
|
|
1173
|
-
//# sourceMappingURL=cell-
|
|
1516
|
+
export { Replies as $, LineCount as A, Prediction as B, HopSignal as C, latestEndOf as Ct, Jitter as D, ImageSource as E, Observer as F, QueueConnection as G, ProxyHop as H, Outcomes as I, Reconnects as J, QueueEnd as K, Pair as L, MiddleboxEvent as M, MiddleboxExpectation as N, Kafka as O, MiddleboxForm as P, ReplicaSetStage as Q, PinnedImage as R, HopPlace as S, isHopPlace as St, HttpProbe as T, ProxyTime as U, ProbeEvent as V, QueueBand as W, Reference as X, Recovers as Y, ReplicaSet as Z, GroupPlace as _, Subject as _t, Cluster as a, RunDrill as at, Hop as b, Toxic as bt, CountBand as c, RunPart as ct, DriverStep as d, SentinelEvent as dt, RequestPrediction as et, Fabric as f, SentinelStage as ft, Group as g, StageBand as gt, FaultPlace as h, Stage as ht, ClientImage as i, RunBackup as it, LineMatch as j, KernelRecord as k, Drill as l, RunRoute as lt, Fault as m, ShippedImage as mt, Cell as n, RttRange as nt, ClusterClientAt as o, RunFabric as ot, FabricManifest as p, Shipped as pt, QueuePrediction as q, Client as r, Run as rt, ClusterStage as s, RunGroup as st, BuildImage as t, RouterHop as tt, DriverBand as u, RunTopology as ut, GroupPrediction as v, Target as vt, HopWrite as w, HopEvent as x, WsProbe as xt, GroupRole as y, Topology as yt, PortsPrediction as z };
|
|
1517
|
+
//# sourceMappingURL=cell-DZm8zXN4.d.ts.map
|