@mark1russell7/harness 0.14.3 → 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/build/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as RunRoute, A as MiddleboxExpectation, B as Reference, C as HopWrite, D as KernelRecord, E as Jitter, F as ProbeEvent, G as RouterHop, H as ReplicaSetStage, I as ProxyHop, J as RunBackup, K as RttRange, L as ProxyTime, M as Observer, N as PinnedImage, O as LineMatch, P as Prediction, Q as RunPart, R as Reconnects, S as HopSignal, T as ImageSource, U as Replies, V as ReplicaSet, W as RequestPrediction, X as RunFabric, Y as RunDrill, Z as RunGroup, _ as GroupPrediction, a as Cluster, at as Stage, b as HopEvent, c as Drill, ct as Target, d as Fabric, dt as WsProbe, et as RunTopology, f as FabricManifest, ft as isHopPlace, g as GroupPlace, h as Group, i as ClientImage, it as ShippedImage, j as MiddleboxForm, k as MiddleboxEvent, l as DriverBand, lt as Topology, m as FaultPlace, n as Cell, nt as SentinelStage, o as ClusterClientAt, ot as StageBand, p as Fault, pt as latestEndOf, q as Run, r as Client, rt as Shipped, s as ClusterStage, st as Subject, t as BuildImage, tt as SentinelEvent, u as DriverStep, ut as Toxic, v as GroupRole, w as HttpProbe, x as HopPlace, y as Hop, z as Recovers } from "./cell-B3-BSTit.js";
1
+ import { $ as Replies, A as LineCount, B as Prediction, C as HopSignal, Ct as latestEndOf, D as Jitter, E as ImageSource, F as Observer, G as QueueConnection, H as ProxyHop, I as Outcomes, J as Reconnects, K as QueueEnd, L as Pair, M as MiddleboxEvent, N as MiddleboxExpectation, O as Kafka, P as MiddleboxForm, Q as ReplicaSetStage, R as PinnedImage, S as HopPlace, St as isHopPlace, T as HttpProbe, U as ProxyTime, V as ProbeEvent, W as QueueBand, X as Reference, Y as Recovers, Z as ReplicaSet, _ as GroupPlace, _t as Subject, a as Cluster, at as RunDrill, b as Hop, bt as Toxic, c as CountBand, ct as RunPart, d as DriverStep, dt as SentinelEvent, et as RequestPrediction, f as Fabric, ft as SentinelStage, g as Group, gt as StageBand, h as FaultPlace, ht as Stage, i as ClientImage, it as RunBackup, j as LineMatch, k as KernelRecord, l as Drill, lt as RunRoute, m as Fault, mt as ShippedImage, n as Cell, nt as RttRange, o as ClusterClientAt, ot as RunFabric, p as FabricManifest, pt as Shipped, q as QueuePrediction, r as Client, rt as Run, s as ClusterStage, st as RunGroup, t as BuildImage, tt as RouterHop, u as DriverBand, ut as RunTopology, v as GroupPrediction, vt as Target, w as HopWrite, x as HopEvent, xt as WsProbe, y as GroupRole, yt as Topology, z as PortsPrediction } from "./cell-DZm8zXN4.js";
2
2
  import { Quantity } from "@mark1russell7/quantity";
3
3
  import { StartedTestContainer } from "testcontainers";
4
4
  //#region src/application.d.ts
@@ -295,6 +295,9 @@ interface ErrorOnTheWay {
295
295
  * of a split brain. It is null when the group did not converge after the run.
296
296
  * - `unknown` are the writes that the client sent and did not see accepted: an error, or no answer.
297
297
  * `held` tells if the group kept each one, or null when it did not converge.
298
+ * - `duplicates` has one entry for each extra copy that the group holds: a write held three times
299
+ * has two entries. It is null when the group did not converge. A key holds one copy by
300
+ * construction, thus only a list can show a copy.
298
301
  */
299
302
  interface Writes {
300
303
  readonly sent: number;
@@ -305,6 +308,18 @@ interface Writes {
305
308
  readonly n: number;
306
309
  readonly held: boolean | null;
307
310
  }>;
311
+ readonly duplicates?: readonly number[] | null;
312
+ /** These are the counts of a pair (`Cell.pair`), from its two final reads. */
313
+ readonly sets?: PairSets;
314
+ }
315
+ /** These are the counts that the bands of `Outcomes` judge: each one has the same name there. */
316
+ interface PairSets {
317
+ readonly unknown: number;
318
+ readonly kept: number;
319
+ readonly stranded: number;
320
+ readonly absent: number;
321
+ readonly missing: number;
322
+ readonly warnings: number;
308
323
  }
309
324
  /** A group measurement is what one run of a group cell measured, beside its time. */
310
325
  interface GroupMeasured {
@@ -406,6 +421,78 @@ interface GroupReading {
406
421
  */
407
422
  export declare const measureGroup: (cell: Cell, run: Run) => GroupReading;
408
423
  //#endregion
424
+ //#region src/ports.d.ts
425
+ /** This record is what a run of a port cell measured. */
426
+ interface PortsReading {
427
+ /** This count is the rounds of the run, each destination once. */
428
+ readonly rounds: number;
429
+ /** This record gives the count of searches for each count of connects, by that count. */
430
+ readonly counts: Readonly<Record<string, number>>;
431
+ /** These offsets from the low port are the ports that the run used, in rising order. */
432
+ readonly seen: readonly number[];
433
+ /** These errnos ended the searches of the run, each one time. */
434
+ readonly errnos: readonly string[];
435
+ /** This time is the longest connect that failed. */
436
+ readonly refusal: Quantity;
437
+ /** This time is from the `closing` line to the first `freed` line. */
438
+ readonly firstFreed: Quantity | null;
439
+ /** This time is from the `closing` line to the last `freed` line. */
440
+ readonly lastFreed: Quantity | null;
441
+ /** This count is the `freed` lines of the run. */
442
+ readonly freed: number;
443
+ /** This count is the connects that failed before the last `freed` line. */
444
+ readonly tries: number;
445
+ }
446
+ /**
447
+ * This function reads one run of a port cell. The `round` lines give each search. The `closing` and
448
+ * `freed` lines give when each held port comes back. The records of the prober give the
449
+ * retransmissions.
450
+ */
451
+ export declare const measurePorts: (run: Run, expected: PortsPrediction) => Measured;
452
+ //#endregion
453
+ //#region src/queue.d.ts
454
+ /** This record is what one connection of a queue cell did, from its lines and the records of its socket. */
455
+ interface QueueConnectionReading {
456
+ readonly name: string;
457
+ readonly connected: boolean;
458
+ /** These times are the waits of the SYN. The first one counts from the dial. */
459
+ readonly syns: readonly Quantity[];
460
+ /** These times are the waits of each SYN-ACK sent again. The first one counts from the dial. */
461
+ readonly synAcks: readonly Quantity[];
462
+ /** This count is the segments that the socket sent again. */
463
+ readonly retransmissions: number;
464
+ readonly errno: string | null;
465
+ /** This time is from the line of the prediction to the end of the connection. It is null for a live connection, or with no prediction. */
466
+ readonly ended: Quantity | null;
467
+ /** This time is from the last retransmission to the end of the connection. */
468
+ readonly afterLast: Quantity | null;
469
+ /** This count is the segments of the socket with no acknowledgment at the end of the run. */
470
+ readonly unacked: number | null;
471
+ }
472
+ /** This record is what a run of a queue cell measured. The counts are the changes in the run. */
473
+ interface QueueReading {
474
+ readonly max: number;
475
+ readonly held: number;
476
+ readonly connected: number;
477
+ readonly overflows: number;
478
+ readonly drops: number;
479
+ readonly cookies: number;
480
+ readonly timeouts: number;
481
+ readonly resets: number;
482
+ readonly drained: number;
483
+ /** This time is from the first dial of the burst to the last `TCPTimeouts` of the prediction. */
484
+ readonly expiry: Quantity | null;
485
+ /** This time is from the first dial of the burst to the rise of the count of the queue. */
486
+ readonly rise: Quantity | null;
487
+ readonly connections: readonly QueueConnectionReading[];
488
+ }
489
+ /**
490
+ * This function reads one run of a queue cell. The client lines give the connections and the
491
+ * counters at the two ends of the run. The target lines give the count of the queue. The records of
492
+ * the prober give the waits of each socket.
493
+ */
494
+ export declare const measureQueue: (run: Run, expected: QueuePrediction) => Measured;
495
+ //#endregion
409
496
  //#region src/verdict.d.ts
410
497
  /** This function gives the words of the outcome of a second request: its connection, a retry, and its end. */
411
498
  export declare const requestWords: (outcome: {
@@ -577,6 +664,8 @@ interface StageVerdict {
577
664
  * - `unknown` counts the writes whose outcome the client did not see, and how many the group kept.
578
665
  * - `errors` are the errors on the way: the runs that met each, and the median of its first time.
579
666
  * - `lags` is the spread of the delays of the stamps, for a calibration.
667
+ * - `duplicates` counts the extra copies that the group holds, in each run. A cell with no band of
668
+ * copies has no such count.
580
669
  */
581
670
  interface GroupVerdict {
582
671
  readonly stages: readonly StageVerdict[];
@@ -601,6 +690,12 @@ interface GroupVerdict {
601
690
  readonly first: Quantity;
602
691
  }>;
603
692
  readonly lags?: Spread | null;
693
+ readonly duplicates?: {
694
+ readonly runs: number;
695
+ readonly total: number;
696
+ readonly median: number | null;
697
+ readonly max: number | null;
698
+ };
604
699
  }
605
700
  /**
606
701
  * This function gives the value at quantile p of sorted values, by nearest rank: x_(⌈p·n⌉). It is
@@ -712,6 +807,10 @@ interface Measured {
712
807
  readonly crossings?: Crossings;
713
808
  /** This record is what a run of a group cell measured: the stages of its timeline, and what became of each write. */
714
809
  readonly group?: GroupMeasured;
810
+ /** This record is what a run of a queue cell measured: the count of the queue, its counters, and each connection. */
811
+ readonly queue?: QueueReading;
812
+ /** This record is what a run of a port cell measured: the count of each search, and when each port came back. */
813
+ readonly ports?: PortsReading;
715
814
  /** This record is what the second request of an HTTP client met, for a cell whose prediction says it. */
716
815
  readonly request?: RequestReading | null;
717
816
  /** This record is the time of each later band of a driver cell (`DriverBand.then`). */
@@ -1102,6 +1201,8 @@ export declare const pgClientImage: () => Promise<string>;
1102
1201
  export declare const hikariClientImage: () => Promise<string>;
1103
1202
  /** This function gives the image of the RabbitMQ client: amqplib, with the client and the admin of a cluster cell. */
1104
1203
  export declare const amqpClientImage: () => Promise<string>;
1204
+ /** This function gives the image of the Kafka client: kafka-clients on Java, with the client and the admin of a Kafka cell. */
1205
+ export declare const kafkaClientImage: () => Promise<string>;
1105
1206
  /** This function gives the image of the gRPC client of the harness: grpc-js 1.14.6 on Node 24.21.0, with its client. */
1106
1207
  export declare const grpcClientImage: () => Promise<string>;
1107
1208
  /**
@@ -1239,6 +1340,8 @@ interface FaultOptions {
1239
1340
  readonly code?: "host" | "net" | "port" | "admin";
1240
1341
  /** This length is the longest segment in bytes that an MTU drop lets through. */
1241
1342
  readonly above?: number;
1343
+ /** These are the addresses that the rule faces, in place of the peer of its place. */
1344
+ readonly peers?: readonly string[];
1242
1345
  }
1243
1346
  /**
1244
1347
  * A fault side is the namespace that gets the rules of a fault: the namespace of the peer of the
@@ -1380,8 +1483,17 @@ interface Agent {
1380
1483
  exec(argv: readonly string[]): Promise<string>;
1381
1484
  stop(): Promise<void>;
1382
1485
  }
1486
+ /** A sibling is a server that a lab starts on the network of the target, for example a standby. */
1487
+ interface Sibling {
1488
+ readonly ip: string;
1489
+ readonly netns: number;
1490
+ /** This method starts a command in the sibling, and gives its standard output. */
1491
+ exec(argv: readonly string[]): Promise<string>;
1492
+ }
1383
1493
  /** A lab is one environment: the target, the client, the hops of a topology, the injectors and the prober. */
1384
1494
  interface Lab {
1495
+ /** This address is the address of the target on its own network. */
1496
+ readonly serverIp: string;
1385
1497
  /** This address is the address that the client connects to: the target, or the first proxy of a topology. */
1386
1498
  readonly targetIp: string;
1387
1499
  /** This port is the port that the client connects to. */
@@ -1412,6 +1524,10 @@ interface Lab {
1412
1524
  agent(image: string, command: readonly string[], options?: {
1413
1525
  readonly pid?: boolean;
1414
1526
  }): Promise<Agent>;
1527
+ /** This method starts a sibling, and waits for a line of its log. */
1528
+ sibling(image: string, command: readonly string[], ready: string): Promise<Sibling>;
1529
+ /** This method starts a command in the target, and gives its standard output. */
1530
+ exec(argv: readonly string[]): Promise<string>;
1415
1531
  /** These are all the records that the prober wrote, in sequence. */
1416
1532
  readonly kernel: readonly KernelRecord[];
1417
1533
  /** This method sets the sysctls of the client namespace through its privileged sidecar, and reads them back. */
@@ -1578,6 +1694,32 @@ export declare const deviceOf: (route: string) => string;
1578
1694
  */
1579
1695
  export declare const openLab: (target: Target, kind?: Client | ClientImage, topology?: Topology) => Promise<Lab>;
1580
1696
  //#endregion
1697
+ //#region src/standby.d.ts
1698
+ /** This text is the line of the log of a standby that serves reads (src/backend/postmaster/postmaster.c:3740). */
1699
+ export declare const STANDBY_READY: string;
1700
+ /** This text is the write of the client, with its sequence number. */
1701
+ export declare const INSERT: string;
1702
+ /** This function gives the command of a standby: a base backup of the primary, then the server in recovery. */
1703
+ export declare const standbyCommand: (primary: string) => string[];
1704
+ /** This command starts the old primary again, after the stop of each of its processes. Its crash recovery runs before the wait ends. */
1705
+ export declare const RESTART: readonly string[];
1706
+ /** This function reads the output of a query for sequence numbers into a sorted list. */
1707
+ export declare const numbersOf: (text: string) => number[];
1708
+ /** This function gives the arguments of the client of a run. */
1709
+ export declare const pairArgs: (cell: Cell, lab: Pick<Lab, "targetIp" | "targetPort">) => string[];
1710
+ /** This function gives the instants of the cancels of a hold, in ns from the fault: equal parts of the hold. */
1711
+ export declare const cancelsOf: (pair: Pair, holdNs: number) => number[];
1712
+ /**
1713
+ * This function opens the pair of an environment. The table comes first and the standby next: the
1714
+ * base backup has it. A synchronous standby is named last, thus no setup step waits for it.
1715
+ */
1716
+ export declare const openStandby: (lab: Lab, cell: Cell) => Promise<Sibling>;
1717
+ /**
1718
+ * This function does one run of a pair. A dry run writes and stops, with no fault: the warm-up of the
1719
+ * environment. It removes its rows, thus the numbers of the run start on an empty table.
1720
+ */
1721
+ export declare const pairOnce: (lab: Lab, standby: Sibling, cell: Cell, environment: number, index: number, dry?: boolean) => Promise<Run>;
1722
+ //#endregion
1581
1723
  //#region src/locks.d.ts
1582
1724
  /**
1583
1725
  * This module reads the lockfiles of a build context for the manifest of a run. A lockfile pins each
@@ -1632,6 +1774,28 @@ export declare const versionsOf: (files: readonly ContextFile[]) => Record<strin
1632
1774
  export declare const manifestProblems: (manifest: Manifest) => string[];
1633
1775
  /** This function gives the problem of the commit of a record: no commit, or a text that is not a commit of git. */
1634
1776
  export declare const commitProblems: (commit: string | undefined) => string[];
1777
+ /** The code of a record is the commit of the checkout that operated, and if its tracked files had changes. */
1778
+ interface RecordCode {
1779
+ readonly commit: string;
1780
+ readonly dirty: boolean;
1781
+ }
1782
+ /** These are the parts of a record that tell if it pins the programs of its runs. */
1783
+ interface Pinnable {
1784
+ readonly code?: RecordCode | undefined;
1785
+ readonly manifests: readonly Manifest[];
1786
+ /** A local debug run marks its record so. No page reads such a record. */
1787
+ readonly debug?: boolean | undefined;
1788
+ }
1789
+ /** This problem is the problem of a checkout with changes: its commit does not hold the code that operated. */
1790
+ export declare const DIRTY = "the checkout has changes to tracked files that no commit holds";
1791
+ /** This problem is the problem of a record of a local debug run. */
1792
+ export declare const DEBUG = "the record is of a local debug run, and no page reads it";
1793
+ /**
1794
+ * This function gives each problem that stops a record from pinning the programs of its runs. A
1795
+ * record with a problem is not a record (SYS-101). The writer of the cells refuses it, and the read
1796
+ * of a schedule refuses it. A commit with changes to tracked files is not a pin.
1797
+ */
1798
+ export declare const recordProblems: (record: Pinnable) => string[];
1635
1799
  //#endregion
1636
1800
  //#region src/group.d.ts
1637
1801
  /**
@@ -1708,8 +1872,8 @@ export declare const memberConfig: (group: Group, primary: string | null) => str
1708
1872
  export declare const sentinelConfig: (group: Group, primary: string) => string;
1709
1873
  /**
1710
1874
  * This function gives the peers that a fault on a part cuts it from, by their addresses. `all` is
1711
- * each other part and the client, `group` is the other parts, and `clients` is the client. `one`
1712
- * and `one-way` are the first other member. The observer is not a peer, thus the timeline of the
1875
+ * each other part and the client, `group` is the other parts, and `clients` and `to-clients` are
1876
+ * the client. `one` and `one-way` are the first other member. The observer is not a peer, thus the timeline of the
1713
1877
  * group stays whole.
1714
1878
  */
1715
1879
  export declare const peersOf: (parts: {
@@ -2009,6 +2173,7 @@ export declare const clusterViewOf: (cluster: Cluster, rows: readonly StatusRow[
2009
2173
  * This function gives the peers that a fault on a node cuts it from. `all` is each other node and the
2010
2174
  * client, `group` is the other nodes, and `clients` is the client. `one` is the first other node in
2011
2175
  * the sequence of the cluster, and `one-way` is the same node for the segments from the part only.
2176
+ * `to-clients` is the client, for the segments from the part only.
2012
2177
  */
2013
2178
  export declare const clusterCutOf: (cluster: Cluster, members: Readonly<Record<string, RunPart>>, client: string, part: string, cuts: NonNullable<GroupPlace["cuts"]>) => Cut;
2014
2179
  /** A wall stamp is the wall clock in ns around a command of a node: the run puts it on the monotonic clock. */
@@ -2109,6 +2274,106 @@ export declare const restamped: (line: NodeLine, events: readonly ProbeEvent[])
2109
2274
  */
2110
2275
  export declare const clusterOnce: (lab: ClusterLab, cell: Cell, environment: number, index: number) => Promise<Run>;
2111
2276
  //#endregion
2277
+ //#region src/kafka.d.ts
2278
+ /** This function gives the node id of a name. A broker has its place in the list from 1, and the controller has the id after them. */
2279
+ export declare const nodeIdOf: (kafka: Kafka, name: string) => number;
2280
+ /**
2281
+ * This function gives the variable of a server property for the image. The wrapper of the image
2282
+ * reverses this map (KafkaDockerWrapper.scala:188-203). After the prefix `KAFKA_`, `___` is a
2283
+ * hyphen, `__` is an underscore and `_` is a dot.
2284
+ */
2285
+ export declare const envOf: (property: string) => string;
2286
+ /** This function gives the environment of a broker. */
2287
+ export declare const brokerEnv: (kafka: Kafka, name: string) => Record<string, string>;
2288
+ /** This function gives the environment of the controller. The start script of the image stops on an advertised listener here (configure:43-48). */
2289
+ export declare const controllerEnv: (kafka: Kafka) => Record<string, string>;
2290
+ /** A partition view is the output of the command `view` of the admin. Without a topic it has only the brokers. */
2291
+ interface PartitionView {
2292
+ readonly brokers: readonly number[];
2293
+ readonly leader?: number | null;
2294
+ readonly isr?: readonly number[];
2295
+ readonly replicas?: readonly number[];
2296
+ }
2297
+ /**
2298
+ * This function judges a view of a partition: its leader, and if the group is healthy. A healthy
2299
+ * group has each broker not fenced, one leader, and each broker in the in-sync replicas.
2300
+ */
2301
+ export declare const kafkaViewOf: (kafka: Kafka, view: PartitionView) => GroupView;
2302
+ /**
2303
+ * This function gives the peers that a fault on a broker cuts it from. Only `group` has a law: the
2304
+ * other brokers and the controller, and the client keeps its route to the broker.
2305
+ */
2306
+ export declare const kafkaCutOf: (kafka: Kafka, members: Readonly<Record<string, RunPart>>, controller: RunPart, part: string, cuts: NonNullable<GroupPlace["cuts"]>) => Cut;
2307
+ /** This function gives the addresses that the client and the admin bootstrap from. */
2308
+ export declare const bootstrapOf: (kafka: Kafka) => string;
2309
+ /** This function gives the name of the topic of a run. A warm-up has the index -1. */
2310
+ export declare const topicOf: (environment: number, index: number) => string;
2311
+ /** A Kafka lab is one environment of a Kafka cell. */
2312
+ interface KafkaLab {
2313
+ readonly kafka: Kafka;
2314
+ readonly clientIp: string;
2315
+ readonly members: Readonly<Record<string, RunPart>>;
2316
+ readonly controller: RunPart;
2317
+ readonly netns: {
2318
+ readonly client: number;
2319
+ };
2320
+ /** These are all the records that the prober wrote, in sequence. */
2321
+ readonly kernel: readonly KernelRecord[];
2322
+ /** These are the last raw lines of the console of each node, for the diagnosis of a lab: at most RAW_TAIL of each. */
2323
+ readonly raw: Readonly<Record<string, readonly string[]>>;
2324
+ /** This method sets the sysctls of the client namespace through its privileged sidecar, and reads them back. */
2325
+ sysctl(values: Readonly<Record<string, string>>): Promise<Record<string, string>>;
2326
+ /** This method waits until each broker is not fenced. */
2327
+ brokersUp(within?: number): Promise<void>;
2328
+ /** This method makes the topic of a run. */
2329
+ create(topic: string): Promise<void>;
2330
+ /** This method waits until the partition is whole and calm, and gives the name of the broker of its leader. */
2331
+ converge(topic: string, within?: number): Promise<string>;
2332
+ /** This method gives the sequence numbers that the partition holds, one entry for each copy. */
2333
+ holds(topic: string): Promise<number[]>;
2334
+ /** This method starts the client of a run, with the arguments of `ClientKafka`. */
2335
+ client(args: readonly string[]): Promise<GroupClient>;
2336
+ /** This method applies a network fault between a broker and some of its peers, at once or at an instant of the VM. */
2337
+ fault(kind: GroupNetworkFault, part: string, cuts: NonNullable<GroupPlace["cuts"]>, at?: number): Promise<Stamp>;
2338
+ /** This method removes a network fault, at once or at an instant of the VM. */
2339
+ lift(kind: GroupNetworkFault, part: string, cuts: NonNullable<GroupPlace["cuts"]>, at?: number): Promise<Stamp>;
2340
+ /** This method removes the TCP metrics of the client namespace: each run starts from a kernel that keeps nothing. */
2341
+ forget(): Promise<void>;
2342
+ /** This method waits for the next clock line of the prober, which gives the count of lost records. */
2343
+ settle(): Promise<number | null>;
2344
+ manifest(sysctls: Readonly<Record<string, string>>): Promise<Manifest>;
2345
+ close(): Promise<void>;
2346
+ }
2347
+ /**
2348
+ * This function opens one environment of a Kafka cell:
2349
+ * - one new network, with each node, the client and the commander on it.
2350
+ * - the controller first, then each broker: the stock image with its own command. The brokers
2351
+ * register with the controller, thus they need it first.
2352
+ * - an injector sidecar for each node, in its network and process namespaces.
2353
+ * - a client that holds its own network namespace, with a privileged sidecar for its sysctls.
2354
+ * - the prober, which watches the namespace of the client.
2355
+ */
2356
+ export declare const openKafkaLab: (kafka: Kafka) => Promise<KafkaLab>;
2357
+ /**
2358
+ * This time is how long a run continues after its lift. The record then shows the step-down of the
2359
+ * leader and the writes after it. It has no source. It is above the largest step-down of the
2360
+ * law, which is approximately 2 s after the lift.
2361
+ */
2362
+ export declare const KAFKA_TAIL_MS = 1e4;
2363
+ /** This function gives the arguments of the client of a Kafka cell: the topic, the writers, the stream of writes and the settings. */
2364
+ export declare const kafkaArgs: (cell: Cell, topic: string) => string[];
2365
+ /**
2366
+ * This function does one run of a Kafka cell:
2367
+ * - Each broker is up, the topic of the run exists, and its partition is whole. The client starts,
2368
+ * and its stream of writes gets steady.
2369
+ * - The fault cuts the leader from the other brokers and the controller, and it lifts at its instant
2370
+ * in the VM. The client keeps its route to the leader, thus only the group knows of the cut.
2371
+ * - The run waits for the lift and for the tail after it.
2372
+ * - Each fault goes, the client stops, and the partition converges again. The admin then reads
2373
+ * the whole partition, thus the record tells which writes the group kept.
2374
+ */
2375
+ export declare const kafkaOnce: (lab: KafkaLab, cell: Cell, environment: number, index: number) => Promise<Run>;
2376
+ //#endregion
2112
2377
  //#region src/run.d.ts
2113
2378
  /** A cell result is a cell with its manifests, its runs, their measurements and its verdict. */
2114
2379
  interface CellResult {
@@ -2157,5 +2422,5 @@ export declare const spread: (runs: number, environments: number) => number[];
2157
2422
  */
2158
2423
  export declare const runCell: (cell: Cell, say?: (line: string) => void) => Promise<CellResult>;
2159
2424
  //#endregion
2160
- export { type Agent, type BuildImage, type BuildRecord, type CallReading, type Cell, type CellResult, type Client, type ClientImage, type ClockPair, type Cloud, type Cluster, type ClusterClientAt, type ClusterLab, type ClusterStage, type ContextFile, type Crossings, type Cut, type Decision, type Drill, type DriverBand, type DriverSocket, type DriverStep, type DriverStepTime, type ErrorOnTheWay, type Fabric, type FabricLab, type FabricManifest, type FabricParts, type Fault, type FaultPlace, type FaultSide, type Group, type GroupClient, type GroupLab, type GroupMeasured, type GroupNetworkFault, type GroupPlace, type GroupPrediction, type GroupReading, type GroupRole, type GroupVerdict, type GroupView, type Hop, type HopEvent, type HopPlace, type HopSignal, type HopWrite, type Host, type HttpProbe, type ImagePlan, type ImageSource, type Interval, type Jitter, type KernelRecord, type Lab, type Layer, type LeafViews, type LineMatch, type Manifest, type ManifestHop, type Measured, type MemberLine, type MiddleboxEvent, type MiddleboxExpectation, type MiddleboxForm, type NetworkFault, type NodeLine, type Observer, type OplogRead, type OplogTime, type Outcome, type Pairing, type PinnedImage, type Prediction, type Probe, type ProbeEvent, type ProgramEvent, type ProxyHop, type ProxyTime, type ReconnectReading, type ReconnectVerdict, type Reconnects, type Recovers, type RecoveryMeasured, type Reference, type Reordering, type ReplicaSet, type ReplicaSetLab, type ReplicaSetStage, type Replies, type RequestPrediction, type RequestReading, type RouteLine, type RouterHop, type RttRange, type Run, type RunBackup, type RunDrill, type RunFabric, type RunGroup, type RunPart, type RunRoute, type RunTopology, type SentinelEvent, type SentinelStage, type Shipped, type ShippedImage, type SocketPlace, type Spread, type Stage, type StageBand, type StageVerdict, type Stamp, type Status, type StatusRow, type Subject, type Substrate, type SubstrateSource, type Target, type Topology, type Toxic, type Verdict, type WallStamp, type Writes, type WsProbe, isHopPlace, latestEndOf };
2425
+ export { type Agent, type BuildImage, type BuildRecord, type CallReading, type Cell, type CellResult, type Client, type ClientImage, type ClockPair, type Cloud, type Cluster, type ClusterClientAt, type ClusterLab, type ClusterStage, type ContextFile, type CountBand, type Crossings, type Cut, type Decision, type Drill, type DriverBand, type DriverSocket, type DriverStep, type DriverStepTime, type ErrorOnTheWay, type Fabric, type FabricLab, type FabricManifest, type FabricParts, type Fault, type FaultPlace, type FaultSide, type Group, type GroupClient, type GroupLab, type GroupMeasured, type GroupNetworkFault, type GroupPlace, type GroupPrediction, type GroupReading, type GroupRole, type GroupVerdict, type GroupView, type Hop, type HopEvent, type HopPlace, type HopSignal, type HopWrite, type Host, type HttpProbe, type ImagePlan, type ImageSource, type Interval, type Jitter, type Kafka, type KafkaLab, type KernelRecord, type Lab, type Layer, type LeafViews, type LineCount, type LineMatch, type Manifest, type ManifestHop, type Measured, type MemberLine, type MiddleboxEvent, type MiddleboxExpectation, type MiddleboxForm, type NetworkFault, type NodeLine, type Observer, type OplogRead, type OplogTime, type Outcome, type Outcomes, type Pair, type PairSets, type Pairing, type PartitionView, type Pinnable, type PinnedImage, type PortsPrediction, type PortsReading, type Prediction, type Probe, type ProbeEvent, type ProgramEvent, type ProxyHop, type ProxyTime, type QueueBand, type QueueConnection, type QueueConnectionReading, type QueueEnd, type QueuePrediction, type QueueReading, type ReconnectReading, type ReconnectVerdict, type Reconnects, type RecordCode, type Recovers, type RecoveryMeasured, type Reference, type Reordering, type ReplicaSet, type ReplicaSetLab, type ReplicaSetStage, type Replies, type RequestPrediction, type RequestReading, type RouteLine, type RouterHop, type RttRange, type Run, type RunBackup, type RunDrill, type RunFabric, type RunGroup, type RunPart, type RunRoute, type RunTopology, type SentinelEvent, type SentinelStage, type Shipped, type ShippedImage, type Sibling, type SocketPlace, type Spread, type Stage, type StageBand, type StageVerdict, type Stamp, type Status, type StatusRow, type Subject, type Substrate, type SubstrateSource, type Target, type Topology, type Toxic, type Verdict, type WallStamp, type Writes, type WsProbe, isHopPlace, latestEndOf };
2161
2426
  //# sourceMappingURL=index.d.ts.map