@mark1russell7/machines 0.3.17 → 0.3.19
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 +7 -1
- package/build/index.d.ts +36 -0
- package/build/index.js +742 -163
- package/build/index.js.map +1 -1
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
1
|
import { machineSchema } from "@mark1russell7/algebra";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
//#region src/grpc/grpc-go-server.ts
|
|
4
|
-
const AT$
|
|
4
|
+
const AT$12 = "grpc-go v1.84.0";
|
|
5
5
|
const GO = "go1.27.2 src/net";
|
|
6
6
|
const ETCD = "etcd v3.6.15";
|
|
7
7
|
/** These are the facts of the transport of grpc-go, for each server on it. */
|
|
8
8
|
const TRANSPORT = [
|
|
9
9
|
{
|
|
10
|
-
ref: `${AT$
|
|
10
|
+
ref: `${AT$12} internal/transport/defaults.go:31-40 the server keepalive: Time 2 h, Timeout 20 s. MinTime of the policy 5 min. MaxConnectionIdle, Age and AgeGrace infinite`,
|
|
11
11
|
rung: "implemented"
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
|
-
ref: `${AT$
|
|
14
|
+
ref: `${AT$12} internal/transport/http2_server.go:226-253 the defaults of the parameters, a jitter of 10 % on MaxConnectionAge, and TCP_USER_TIMEOUT = Timeout when Time is not infinite`,
|
|
15
15
|
rung: "implemented"
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
|
-
ref: `${AT$
|
|
18
|
+
ref: `${AT$12} internal/syscall/syscall_linux.go:71-90 SetTCPUserTimeout acts only on a *net.TCPConn. On any other net.Conn it does nothing`,
|
|
19
19
|
rung: "implemented"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
|
-
ref: `${AT$
|
|
22
|
+
ref: `${AT$12} internal/transport/http2_server.go:1197-1286 keepalive(): a PING after Time with no read, and Close when no read comes for Timeout after it. MaxConnectionIdle and MaxConnectionAge drain with GOAWAY, and AgeGrace closes`,
|
|
23
23
|
rung: "implemented"
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
|
-
ref: `${AT$
|
|
26
|
+
ref: `${AT$12} internal/transport/http2_server.go:881-933 handlePing: a PING less than MinTime after the last one is a strike, and with no stream open and PermitWithoutStream false, less than 2 h. The third strike sends GOAWAY ENHANCE_YOUR_CALM too_many_pings and closes the connection`,
|
|
27
27
|
rung: "implemented"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
|
-
ref: `${AT$
|
|
30
|
+
ref: `${AT$12} internal/transport/http2_server.go:279-281, :1064, :1132, :1176 each write of headers, a status or data by the server clears the strikes`,
|
|
31
31
|
rung: "implemented"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
|
-
ref: `${AT$
|
|
34
|
+
ref: `${AT$12} internal/transport/http2_server.go:1291-1310 Close closes the net.Conn: a FIN, or a reset when bytes are unread`,
|
|
35
35
|
rung: "implemented"
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
|
-
ref: `${AT$
|
|
38
|
+
ref: `${AT$12} internal/transport/http2_server.go:536-537, :603-615 a call with the header grpc-timeout gets a timer of that timeout from the read of its headers. Its end closes the stream with RST_STREAM CANCEL, and the context of the handler ends`,
|
|
39
39
|
rung: "implemented"
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
|
-
ref: `${AT$
|
|
42
|
+
ref: `${AT$12} server.go:192, :1000-1009 a deadline of 120 s for the handshake of each new connection (ConnectionTimeout)`,
|
|
43
43
|
rung: "implemented"
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
|
-
ref: `${AT$
|
|
46
|
+
ref: `${AT$12} server.go:894-905 the comment of grpc-go: Go sets a TCP keepalive of 15 s on each accepted connection`,
|
|
47
47
|
rung: "documented"
|
|
48
48
|
},
|
|
49
49
|
{
|
|
@@ -702,7 +702,7 @@ const ETCD_SERVER = serverOf({
|
|
|
702
702
|
});
|
|
703
703
|
//#endregion
|
|
704
704
|
//#region src/grpc/grpc-js.ts
|
|
705
|
-
const AT$
|
|
705
|
+
const AT$11 = "@grpc/grpc-js 1.14.6 src";
|
|
706
706
|
/**
|
|
707
707
|
* This document is grpc-js 1.14.6 on Node, for one channel to one server with no TLS, its transport
|
|
708
708
|
* (one HTTP/2 session on one TCP connection) and one unary call on it. It gives the states of the
|
|
@@ -732,83 +732,83 @@ const GRPC_JS = machineSchema.parse({
|
|
|
732
732
|
},
|
|
733
733
|
sources: [
|
|
734
734
|
{
|
|
735
|
-
ref: `${AT$
|
|
735
|
+
ref: `${AT$11}/transport.ts:70 KEEPALIVE_TIMEOUT_MS is 20000`,
|
|
736
736
|
rung: "implemented"
|
|
737
737
|
},
|
|
738
738
|
{
|
|
739
|
-
ref: `${AT$
|
|
739
|
+
ref: `${AT$11}/transport.ts:183-198 grpc.keepalive_time_ms is -1 when the caller gives none, grpc.keepalive_timeout_ms is 20000, and grpc.keepalive_permit_without_calls is false`,
|
|
740
740
|
rung: "implemented"
|
|
741
741
|
},
|
|
742
742
|
{
|
|
743
|
-
ref: `${AT$
|
|
743
|
+
ref: `${AT$11}/transport.ts:447-453 a PING goes out only with a keepalive time above 0, and with a call in flight or permit_without_calls`,
|
|
744
744
|
rung: "implemented"
|
|
745
745
|
},
|
|
746
746
|
{
|
|
747
|
-
ref: `${AT$
|
|
747
|
+
ref: `${AT$11}/transport.ts:455-507 each PING starts a timer of keepalive_timeout_ms, and its end with no ACK ends the transport (handleDisconnect). A failed send of the PING ends it too`,
|
|
748
748
|
rung: "implemented"
|
|
749
749
|
},
|
|
750
750
|
{
|
|
751
|
-
ref: `${AT$
|
|
751
|
+
ref: `${AT$11}/transport.ts:515-534 and :553-561 the keepalive timer starts with the first call in flight, and after each ACK. It is not reset by data. When it ends with no call in flight, the PING goes out at the start of the next call`,
|
|
752
752
|
rung: "implemented"
|
|
753
753
|
},
|
|
754
754
|
{
|
|
755
|
-
ref: `${AT$
|
|
755
|
+
ref: `${AT$11}/transport.ts:200-242 a close or an error of the session, or a close of its socket, ends the transport. A GOAWAY makes it unusable (reportDisconnectToOwner)`,
|
|
756
756
|
rung: "implemented"
|
|
757
757
|
},
|
|
758
758
|
{
|
|
759
|
-
ref: `${AT$
|
|
759
|
+
ref: `${AT$11}/transport.ts:205-227 a GOAWAY ENHANCE_YOUR_CALM with the data too_many_pings tells the subchannel that the server refused the pings`,
|
|
760
760
|
rung: "implemented"
|
|
761
761
|
},
|
|
762
762
|
{
|
|
763
|
-
ref: `${AT$
|
|
763
|
+
ref: `${AT$11}/transport.ts:431-441 handleDisconnect: each call in flight gets onDisconnect, and the session is destroyed in the next turn of the event loop`,
|
|
764
764
|
rung: "implemented"
|
|
765
765
|
},
|
|
766
766
|
{
|
|
767
|
-
ref: `${AT$
|
|
767
|
+
ref: `${AT$11}/transport.ts:684-687 shutdown closes the session: a GOAWAY, then the end of the socket after the last stream`,
|
|
768
768
|
rung: "implemented"
|
|
769
769
|
},
|
|
770
770
|
{
|
|
771
|
-
ref: `${AT$
|
|
771
|
+
ref: `${AT$11}/transport.ts:792-810 the transport is ready at the first SETTINGS of the server (remoteSettings)`,
|
|
772
772
|
rung: "implemented"
|
|
773
773
|
},
|
|
774
774
|
{
|
|
775
|
-
ref: `${AT$
|
|
775
|
+
ref: `${AT$11}/transport.ts:818-840 the TCP connect is net.connect with no timeout`,
|
|
776
776
|
rung: "implemented"
|
|
777
777
|
},
|
|
778
778
|
{
|
|
779
|
-
ref: `${AT$
|
|
779
|
+
ref: `${AT$11}/transport.ts:862 setNoDelay on each connection: TCP_NODELAY, thus no Nagle. No setKeepAlive anywhere in the package`,
|
|
780
780
|
rung: "implemented"
|
|
781
781
|
},
|
|
782
782
|
{
|
|
783
|
-
ref: `${AT$
|
|
783
|
+
ref: `${AT$11}/subchannel-call.ts:360-371 onDisconnect ends the call with UNAVAILABLE 'Connection dropped' in the next turn of the event loop, unless the stream ends first`,
|
|
784
784
|
rung: "implemented"
|
|
785
785
|
},
|
|
786
786
|
{
|
|
787
|
-
ref: `${AT$
|
|
787
|
+
ref: `${AT$11}/subchannel-call.ts:230-329 the end of a stream with no status: REFUSED_STREAM is UNAVAILABLE, CANCEL after a dropped connection is UNAVAILABLE, and an internal error of ECONNRESET or ETIMEDOUT is UNAVAILABLE`,
|
|
788
788
|
rung: "implemented"
|
|
789
789
|
},
|
|
790
790
|
{
|
|
791
|
-
ref: `${AT$
|
|
791
|
+
ref: `${AT$11}/load-balancing-call.ts:257-261 a stream that the server refused has the progress REFUSED, and any other started stream PROCESSED`,
|
|
792
792
|
rung: "implemented"
|
|
793
793
|
},
|
|
794
794
|
{
|
|
795
|
-
ref: `${AT$
|
|
795
|
+
ref: `${AT$11}/retrying-call.ts:631-652 a transparent retry for NOT_STARTED, and one for REFUSED. A PROCESSED call is retried only by a retry policy of the service config, which the defaults do not have`,
|
|
796
796
|
rung: "implemented"
|
|
797
797
|
},
|
|
798
798
|
{
|
|
799
|
-
ref: `${AT$
|
|
799
|
+
ref: `${AT$11}/load-balancing-call.ts:338-345 a pick in TRANSIENT_FAILURE fails the call at once, unless it asks for waitForReady`,
|
|
800
800
|
rung: "implemented"
|
|
801
801
|
},
|
|
802
802
|
{
|
|
803
|
-
ref: `${AT$
|
|
803
|
+
ref: `${AT$11}/resolving-call.ts:118-180 the deadline of a call is a timer from the start of the call. Its end cancels the call with DEADLINE_EXCEEDED`,
|
|
804
804
|
rung: "implemented"
|
|
805
805
|
},
|
|
806
806
|
{
|
|
807
|
-
ref: `${AT$
|
|
807
|
+
ref: `${AT$11}/deadline.ts:39-52 the header grpc-timeout is the time left to the deadline when the call sends its headers, rounded up to whole milliseconds. A server can start a timer of it`,
|
|
808
808
|
rung: "implemented"
|
|
809
809
|
},
|
|
810
810
|
{
|
|
811
|
-
ref: `${AT$
|
|
811
|
+
ref: `${AT$11}/subchannel-call.ts:269-279 a RST_STREAM CANCEL of the server ends the call with CANCELLED 'Call cancelled'`,
|
|
812
812
|
rung: "implemented"
|
|
813
813
|
},
|
|
814
814
|
{
|
|
@@ -816,19 +816,19 @@ const GRPC_JS = machineSchema.parse({
|
|
|
816
816
|
rung: "observed"
|
|
817
817
|
},
|
|
818
818
|
{
|
|
819
|
-
ref: `${AT$
|
|
819
|
+
ref: `${AT$11}/subchannel.ts:275-291 the end of the transport takes the subchannel from READY to IDLE. After too_many_pings the keepalive time doubles`,
|
|
820
820
|
rung: "implemented"
|
|
821
821
|
},
|
|
822
822
|
{
|
|
823
|
-
ref: `${AT$
|
|
823
|
+
ref: `${AT$11}/subchannel.ts:298-304 a failed connect takes the subchannel to TRANSIENT_FAILURE`,
|
|
824
824
|
rung: "implemented"
|
|
825
825
|
},
|
|
826
826
|
{
|
|
827
|
-
ref: `${AT$
|
|
827
|
+
ref: `${AT$11}/backoff-timeout.ts:23-26 the reconnect waits 1000 ms first, each next wait 1.6 times longer, up to 120000 ms, with a jitter of 0.2`,
|
|
828
828
|
rung: "implemented"
|
|
829
829
|
},
|
|
830
830
|
{
|
|
831
|
-
ref: `${AT$
|
|
831
|
+
ref: `${AT$11}/internal-channel.ts:74-77 and :324-325 a channel with no call for grpc.client_idle_timeout_ms goes IDLE: 30 min at the defaults, 1 s at least`,
|
|
832
832
|
rung: "implemented"
|
|
833
833
|
},
|
|
834
834
|
{
|
|
@@ -2581,8 +2581,224 @@ const UNDICI_CLIENT = machineSchema.parse({
|
|
|
2581
2581
|
}
|
|
2582
2582
|
});
|
|
2583
2583
|
//#endregion
|
|
2584
|
+
//#region src/http/undici-retry.ts
|
|
2585
|
+
const AT$10 = "undici 8.12.2 lib/handler/retry-handler.js";
|
|
2586
|
+
/**
|
|
2587
|
+
* This document is one request through a `RetryAgent` of undici 8.12.2: the retries of a reply
|
|
2588
|
+
* whose status is retryable, for example 429 or 503. Each fact comes from the published package at
|
|
2589
|
+
* 8.12.2, with the file and the line. The defaults are 5 retries, a backoff from 500 ms with a factor
|
|
2590
|
+
* of 2, a cap of 30 s, and Retry-After read.
|
|
2591
|
+
*
|
|
2592
|
+
* - The delay of a retry is the Retry-After of the reply, capped by `maxTimeout`. A Retry-After
|
|
2593
|
+
* longer than the cap does not stop the retries: the retry comes early. A reply without
|
|
2594
|
+
* Retry-After gets the backoff, with no jitter.
|
|
2595
|
+
* - The agent gives up after `maxRetries` retries. The caller then gets `RequestRetryError`, with
|
|
2596
|
+
* the status of the last reply. Thus the retry window of the caller is the sum of the delays.
|
|
2597
|
+
* - A POST and a PATCH are not retried.
|
|
2598
|
+
* - The delay is a native Node timer. It arms after the parse of the whole reply, thus it comes after
|
|
2599
|
+
* the last segment by the handling time of the program. No source bounds that time, and this
|
|
2600
|
+
* document does not hold it. The cells add it from a calibration (`HANDLING` in
|
|
2601
|
+
* `packages/cells/src/http/race.ts`).
|
|
2602
|
+
*
|
|
2603
|
+
* The plain `Client` and `fetch` of undici, and the `fetch` of Node 24.21.0 (undici 7.29.1), send no
|
|
2604
|
+
* request again for a status. Their retry window is 0.
|
|
2605
|
+
*/
|
|
2606
|
+
const UNDICI_RETRY = machineSchema.parse({
|
|
2607
|
+
format: "mark1russell7.machine/1",
|
|
2608
|
+
id: "undici-retry-agent",
|
|
2609
|
+
title: "One request through a RetryAgent of undici 8.12.2",
|
|
2610
|
+
layer: "driver",
|
|
2611
|
+
version: "8.12.2",
|
|
2612
|
+
conditions: {
|
|
2613
|
+
undici: "8.12.2",
|
|
2614
|
+
node: "24.21.0",
|
|
2615
|
+
throwOnError: "true"
|
|
2616
|
+
},
|
|
2617
|
+
sources: [
|
|
2618
|
+
{
|
|
2619
|
+
ref: `${AT$10}:125-133 the defaults: retryAfter true, maxTimeout 30000, minTimeout 500, timeoutFactor 2, maxRetries 5, the methods GET HEAD OPTIONS PUT DELETE TRACE QUERY, the statusCodes 500 502 503 504 429`,
|
|
2620
|
+
rung: "implemented"
|
|
2621
|
+
},
|
|
2622
|
+
{
|
|
2623
|
+
ref: "undici 8.12.2 lib/dispatcher/retry-agent.js:18-27: a RetryAgent wraps a dispatcher with a RetryHandler",
|
|
2624
|
+
rung: "implemented"
|
|
2625
|
+
},
|
|
2626
|
+
{
|
|
2627
|
+
ref: `${AT$10}:331-351 the policy: a method or a status out of its lists is not retried, and a counter above maxRetries gives up`,
|
|
2628
|
+
rung: "implemented"
|
|
2629
|
+
},
|
|
2630
|
+
{
|
|
2631
|
+
ref: `${AT$10}:353-370 the delay: Retry-After in seconds times 1000, or an HTTP-date less the clock of the client (:13-16), capped by maxTimeout; 0 at once; else min(minTimeout * timeoutFactor^(counter - 1), maxTimeout); then setTimeout`,
|
|
2632
|
+
rung: "implemented"
|
|
2633
|
+
},
|
|
2634
|
+
{
|
|
2635
|
+
ref: `${AT$10}:380 the counter: one more at each reply`,
|
|
2636
|
+
rung: "implemented"
|
|
2637
|
+
},
|
|
2638
|
+
{
|
|
2639
|
+
ref: `${AT$10}:175-192 and :518-535 a retryable status with throwOnError drops the body of the reply, and the error goes to the policy`,
|
|
2640
|
+
rung: "implemented"
|
|
2641
|
+
},
|
|
2642
|
+
{
|
|
2643
|
+
ref: "undici 8.12.2 lib/core/errors.js:362-371 RequestRetryError: code UND_ERR_REQ_RETRY, statusCode, headers, data.count",
|
|
2644
|
+
rung: "implemented"
|
|
2645
|
+
},
|
|
2646
|
+
{
|
|
2647
|
+
ref: "RFC 9110 §10.2.3: Retry-After, as delay-seconds or an HTTP-date",
|
|
2648
|
+
rung: "normative"
|
|
2649
|
+
}
|
|
2650
|
+
],
|
|
2651
|
+
states: {
|
|
2652
|
+
IDLE: {
|
|
2653
|
+
initial: true,
|
|
2654
|
+
pseudo: true
|
|
2655
|
+
},
|
|
2656
|
+
SENT: { note: "a send of the request waits for its reply" },
|
|
2657
|
+
WAITING: { note: "the delay of a retry: the Retry-After of the reply, or the backoff" },
|
|
2658
|
+
DONE: {
|
|
2659
|
+
final: true,
|
|
2660
|
+
note: "a reply whose status is not retryable goes to the caller"
|
|
2661
|
+
},
|
|
2662
|
+
FAILED: {
|
|
2663
|
+
final: true,
|
|
2664
|
+
note: "RequestRetryError (UND_ERR_REQ_RETRY), with the status of the last reply"
|
|
2665
|
+
}
|
|
2666
|
+
},
|
|
2667
|
+
events: {
|
|
2668
|
+
"req.dispatch": { kind: "app" },
|
|
2669
|
+
"rx.retryable": {
|
|
2670
|
+
kind: "rx",
|
|
2671
|
+
note: "a reply with a status of statusCodes, for example 429 with Retry-After"
|
|
2672
|
+
},
|
|
2673
|
+
"rx.final": {
|
|
2674
|
+
kind: "rx",
|
|
2675
|
+
note: "a reply with another status, for example 200"
|
|
2676
|
+
},
|
|
2677
|
+
"timer.retry": { kind: "timer" }
|
|
2678
|
+
},
|
|
2679
|
+
knobs: {
|
|
2680
|
+
maxRetries: {
|
|
2681
|
+
key: "undici RetryAgent maxRetries",
|
|
2682
|
+
scope: "client",
|
|
2683
|
+
unit: "count",
|
|
2684
|
+
default: 5
|
|
2685
|
+
},
|
|
2686
|
+
minTimeout: {
|
|
2687
|
+
key: "undici RetryAgent minTimeout",
|
|
2688
|
+
scope: "client",
|
|
2689
|
+
unit: "ms",
|
|
2690
|
+
default: 500
|
|
2691
|
+
},
|
|
2692
|
+
maxTimeout: {
|
|
2693
|
+
key: "undici RetryAgent maxTimeout",
|
|
2694
|
+
scope: "client",
|
|
2695
|
+
unit: "ms",
|
|
2696
|
+
default: 3e4
|
|
2697
|
+
},
|
|
2698
|
+
timeoutFactor: {
|
|
2699
|
+
key: "undici RetryAgent timeoutFactor",
|
|
2700
|
+
scope: "client",
|
|
2701
|
+
unit: "count",
|
|
2702
|
+
default: 2
|
|
2703
|
+
},
|
|
2704
|
+
retry_after: {
|
|
2705
|
+
key: "Retry-After of the reply, in seconds",
|
|
2706
|
+
scope: "reply",
|
|
2707
|
+
unit: "s",
|
|
2708
|
+
default: null,
|
|
2709
|
+
note: "the server gives it. An HTTP-date counts on the clock of the client"
|
|
2710
|
+
},
|
|
2711
|
+
hz: {
|
|
2712
|
+
key: "CONFIG_HZ",
|
|
2713
|
+
scope: "global",
|
|
2714
|
+
unit: "Hz",
|
|
2715
|
+
default: null,
|
|
2716
|
+
note: "the HZ of the kernel, for the step of the coarse loop clock of libuv (timers.ts)"
|
|
2717
|
+
}
|
|
2718
|
+
},
|
|
2719
|
+
timers: {
|
|
2720
|
+
retry_after: {
|
|
2721
|
+
duration: {
|
|
2722
|
+
expr: "min(retry_after * 1000, maxTimeout)",
|
|
2723
|
+
unit: "ms"
|
|
2724
|
+
},
|
|
2725
|
+
lateness: nodeTimerLateness("min(retry_after * 1000, maxTimeout)"),
|
|
2726
|
+
early: NODE_TIMER_EARLY,
|
|
2727
|
+
arms: ["enter:WAITING"],
|
|
2728
|
+
cancels: ["req.dispatch"],
|
|
2729
|
+
fires: "timer.retry",
|
|
2730
|
+
note: "setTimeout(cb, retryTimeout) with the Retry-After of the reply. It arms after the parse of the whole reply"
|
|
2731
|
+
},
|
|
2732
|
+
backoff: {
|
|
2733
|
+
duration: {
|
|
2734
|
+
expr: "min(minTimeout * pow(timeoutFactor, fired), maxTimeout)",
|
|
2735
|
+
unit: "ms"
|
|
2736
|
+
},
|
|
2737
|
+
lateness: nodeTimerLateness("min(minTimeout * pow(timeoutFactor, fired), maxTimeout)"),
|
|
2738
|
+
early: NODE_TIMER_EARLY,
|
|
2739
|
+
arms: ["enter:WAITING"],
|
|
2740
|
+
cancels: ["req.dispatch"],
|
|
2741
|
+
fires: "timer.retry",
|
|
2742
|
+
backoff: { resets: ["req.dispatch"] },
|
|
2743
|
+
note: "a reply without Retry-After: 0.5, 1, 2, 4 and 8 s at the defaults, with no jitter"
|
|
2744
|
+
}
|
|
2745
|
+
},
|
|
2746
|
+
transitions: [
|
|
2747
|
+
{
|
|
2748
|
+
id: "ur.send",
|
|
2749
|
+
from: "IDLE",
|
|
2750
|
+
to: "SENT",
|
|
2751
|
+
on: "req.dispatch"
|
|
2752
|
+
},
|
|
2753
|
+
{
|
|
2754
|
+
id: "ur.wait",
|
|
2755
|
+
from: "SENT",
|
|
2756
|
+
to: "WAITING",
|
|
2757
|
+
on: "rx.retryable",
|
|
2758
|
+
guard: "the count of replies is maxRetries or less, the method is in its list, and no part of the body went to the caller",
|
|
2759
|
+
source: "retry-handler.js:331-351, :380, :581-584"
|
|
2760
|
+
},
|
|
2761
|
+
{
|
|
2762
|
+
id: "ur.give-up",
|
|
2763
|
+
from: "SENT",
|
|
2764
|
+
to: "FAILED",
|
|
2765
|
+
on: "rx.retryable",
|
|
2766
|
+
guard: "the count of replies is above maxRetries, or the method is not in its list (POST, PATCH)",
|
|
2767
|
+
errno: "UND_ERR_REQ_RETRY",
|
|
2768
|
+
source: "retry-handler.js:331-335, :347-350, :430-436"
|
|
2769
|
+
},
|
|
2770
|
+
{
|
|
2771
|
+
id: "ur.retry-after",
|
|
2772
|
+
from: "WAITING",
|
|
2773
|
+
to: "SENT",
|
|
2774
|
+
on: "timer.retry",
|
|
2775
|
+
timer: "retry_after",
|
|
2776
|
+
guard: "the reply had a Retry-After of 0 or more",
|
|
2777
|
+
emits: ["tx.request"],
|
|
2778
|
+
source: "retry-handler.js:353-365, :370"
|
|
2779
|
+
},
|
|
2780
|
+
{
|
|
2781
|
+
id: "ur.backoff",
|
|
2782
|
+
from: "WAITING",
|
|
2783
|
+
to: "SENT",
|
|
2784
|
+
on: "timer.retry",
|
|
2785
|
+
timer: "backoff",
|
|
2786
|
+
guard: "the reply had no Retry-After, or one in the past, or one that does not parse",
|
|
2787
|
+
emits: ["tx.request"],
|
|
2788
|
+
source: "retry-handler.js:361-370"
|
|
2789
|
+
},
|
|
2790
|
+
{
|
|
2791
|
+
id: "ur.done",
|
|
2792
|
+
from: "SENT",
|
|
2793
|
+
to: "DONE",
|
|
2794
|
+
on: "rx.final",
|
|
2795
|
+
source: "retry-handler.js:373-383"
|
|
2796
|
+
}
|
|
2797
|
+
]
|
|
2798
|
+
});
|
|
2799
|
+
//#endregion
|
|
2584
2800
|
//#region src/ioredis-sentinel.ts
|
|
2585
|
-
const AT$
|
|
2801
|
+
const AT$9 = "ioredis 6.0.0 built";
|
|
2586
2802
|
/**
|
|
2587
2803
|
* This document is the Sentinel path of ioredis 6.0.0. It tells how ioredis finds the primary of a
|
|
2588
2804
|
* group through the Sentinels, loses it, and connects to the new one. The standalone states of
|
|
@@ -2603,43 +2819,43 @@ const IOREDIS_SENTINEL = machineSchema.parse({
|
|
|
2603
2819
|
},
|
|
2604
2820
|
sources: [
|
|
2605
2821
|
{
|
|
2606
|
-
ref: `${AT$
|
|
2822
|
+
ref: `${AT$9}/connectors/SentinelConnector/index.js:46-121 connect (each Sentinel in turn, then sentinelRetryStrategy)`,
|
|
2607
2823
|
rung: "implemented"
|
|
2608
2824
|
},
|
|
2609
2825
|
{
|
|
2610
|
-
ref: `${AT$
|
|
2826
|
+
ref: `${AT$9}/connectors/SentinelConnector/index.js:145-151 resolveMaster (get-master-addr-by-name, then SENTINEL sentinels)`,
|
|
2611
2827
|
rung: "implemented"
|
|
2612
2828
|
},
|
|
2613
2829
|
{
|
|
2614
|
-
ref: `${AT$
|
|
2830
|
+
ref: `${AT$9}/connectors/SentinelConnector/index.js:175-212 connectToSentinel and resolve (one connection for each question, no retry)`,
|
|
2615
2831
|
rung: "implemented"
|
|
2616
2832
|
},
|
|
2617
2833
|
{
|
|
2618
|
-
ref: `${AT$
|
|
2834
|
+
ref: `${AT$9}/connectors/SentinelConnector/index.js:27-39 check (the role of the ready check)`,
|
|
2619
2835
|
rung: "implemented"
|
|
2620
2836
|
},
|
|
2621
2837
|
{
|
|
2622
|
-
ref: `${AT$
|
|
2838
|
+
ref: `${AT$9}/connectors/SentinelConnector/FailoverDetector.js:6-43 (+switch-master, only with failoverDetector)`,
|
|
2623
2839
|
rung: "implemented"
|
|
2624
2840
|
},
|
|
2625
2841
|
{
|
|
2626
|
-
ref: `${AT$
|
|
2842
|
+
ref: `${AT$9}/redis/RedisOptions.js:9-57 (the defaults)`,
|
|
2627
2843
|
rung: "implemented"
|
|
2628
2844
|
},
|
|
2629
2845
|
{
|
|
2630
|
-
ref: `${AT$
|
|
2846
|
+
ref: `${AT$9}/redis/event_handler.js:294-355 closeHandler (retryStrategy, then maxRetriesPerRequest flushes the queue)`,
|
|
2631
2847
|
rung: "implemented"
|
|
2632
2848
|
},
|
|
2633
2849
|
{
|
|
2634
|
-
ref: `${AT$
|
|
2850
|
+
ref: `${AT$9}/redis/event_handler.js:364-449 readyHandler (retryAttempts back to 0, the resend, the offline queue)`,
|
|
2635
2851
|
rung: "implemented"
|
|
2636
2852
|
},
|
|
2637
2853
|
{
|
|
2638
|
-
ref: `${AT$
|
|
2854
|
+
ref: `${AT$9}/Redis.js:123-240 _connect (connectTimeout, keepAlive) and :379-405 sendCommand (the offline queue)`,
|
|
2639
2855
|
rung: "implemented"
|
|
2640
2856
|
},
|
|
2641
2857
|
{
|
|
2642
|
-
ref: `${AT$
|
|
2858
|
+
ref: `${AT$9}/Redis.js:599-605 handleReconnection (reconnectOnError: null, thus a READONLY error goes to the caller)`,
|
|
2643
2859
|
rung: "implemented"
|
|
2644
2860
|
}
|
|
2645
2861
|
],
|
|
@@ -4799,7 +5015,7 @@ const IOREDIS_STATUS = machineSchema.parse(ioredis_status_default);
|
|
|
4799
5015
|
const MANIFESTATIONS = z.record(z.string(), z.array(z.string())).parse(manifestations_default);
|
|
4800
5016
|
//#endregion
|
|
4801
5017
|
//#region src/mongo/mongod-replication.ts
|
|
4802
|
-
const AT$
|
|
5018
|
+
const AT$8 = "mongodb r9.0.4 src/mongo/db/repl";
|
|
4803
5019
|
/**
|
|
4804
5020
|
* This document is the replication of mongod 9.0.4. It gives one member of a replica set, its view
|
|
4805
5021
|
* of the primary, and the election that it can hold. The states are the states of the member. The
|
|
@@ -4830,95 +5046,95 @@ const MONGOD_REPL = machineSchema.parse({
|
|
|
4830
5046
|
},
|
|
4831
5047
|
sources: [
|
|
4832
5048
|
{
|
|
4833
|
-
ref: `${AT$
|
|
5049
|
+
ref: `${AT$8}/repl_set_config.idl:74-109 the settings: heartbeatIntervalMillis 2000, heartbeatTimeoutSecs 10, electionTimeoutMillis 10000, catchUpTimeoutMillis -1, catchUpTakeoverDelayMillis 30000`,
|
|
4834
5050
|
rung: "implemented"
|
|
4835
5051
|
},
|
|
4836
5052
|
{
|
|
4837
|
-
ref: `${AT$
|
|
5053
|
+
ref: `${AT$8}/repl_server_parameters.idl:320-328 replElectionTimeoutOffsetLimitFraction 0.15`,
|
|
4838
5054
|
rung: "implemented"
|
|
4839
5055
|
},
|
|
4840
5056
|
{
|
|
4841
|
-
ref: `${AT$
|
|
5057
|
+
ref: `${AT$8}/topology_coordinator.cpp:1058-1101 the heartbeat window and the timeout of each request, :1124-1147 the next heartbeat, :1239-1248 a member DOWN`,
|
|
4842
5058
|
rung: "implemented"
|
|
4843
5059
|
},
|
|
4844
5060
|
{
|
|
4845
|
-
ref: `${AT$
|
|
5061
|
+
ref: `${AT$8}/topology_coordinator.h:62 kMaxHeartbeatRetries 2`,
|
|
4846
5062
|
rung: "implemented"
|
|
4847
5063
|
},
|
|
4848
5064
|
{
|
|
4849
|
-
ref: `${AT$
|
|
5065
|
+
ref: `${AT$8}/replication_coordinator_impl_heartbeat.cpp:97-111 the random offset, :346-352 a heartbeat from the primary postpones the election, :1215-1271 the election timeout and its offset`,
|
|
4850
5066
|
rung: "implemented"
|
|
4851
5067
|
},
|
|
4852
5068
|
{
|
|
4853
|
-
ref: `${AT$
|
|
5069
|
+
ref: `${AT$8}/data_replicator_external_state_impl.cpp:70-81 an oplog batch that names a primary postpones the election`,
|
|
4854
5070
|
rung: "implemented"
|
|
4855
5071
|
},
|
|
4856
5072
|
{
|
|
4857
|
-
ref: `${AT$
|
|
5073
|
+
ref: `${AT$8}/delayable_timeout_callback.cpp:149-172 the offset changes at most once in its own length`,
|
|
4858
5074
|
rung: "implemented"
|
|
4859
5075
|
},
|
|
4860
5076
|
{
|
|
4861
|
-
ref: `${AT$
|
|
5077
|
+
ref: `${AT$8}/topology_coordinator.cpp:1440-1457 and :1476-1489 the liveness check: a primary that cannot see a majority steps down`,
|
|
4862
5078
|
rung: "implemented"
|
|
4863
5079
|
},
|
|
4864
5080
|
{
|
|
4865
|
-
ref: `${AT$
|
|
5081
|
+
ref: `${AT$8}/replication_coordinator_impl_heartbeat.cpp:1158-1188 the liveness check runs at the stalest member's last update plus the election timeout`,
|
|
4866
5082
|
rung: "implemented"
|
|
4867
5083
|
},
|
|
4868
5084
|
{
|
|
4869
|
-
ref: `${AT$
|
|
5085
|
+
ref: `${AT$8}/replication_coordinator_impl_elect_v1.cpp:189-226 the dry run, :268-382 the term, the durable vote and the real vote, :408-468 the win`,
|
|
4870
5086
|
rung: "implemented"
|
|
4871
5087
|
},
|
|
4872
5088
|
{
|
|
4873
|
-
ref: `${AT$
|
|
5089
|
+
ref: `${AT$8}/vote_requester.cpp:96 a vote request times out at min(electionTimeoutMillis, 30 s), :160-177 a majority of yes votes ends the round`,
|
|
4874
5090
|
rung: "implemented"
|
|
4875
5091
|
},
|
|
4876
5092
|
{
|
|
4877
|
-
ref: `${AT$
|
|
5093
|
+
ref: `${AT$8}/topology_coordinator.cpp:3741-3790 a member votes for each candidate whose data is not staler than its own, and only an arbiter refuses one because it sees a primary`,
|
|
4878
5094
|
rung: "implemented"
|
|
4879
5095
|
},
|
|
4880
5096
|
{
|
|
4881
|
-
ref: `${AT$
|
|
5097
|
+
ref: `${AT$8}/replication_coordinator_impl_catchup.cpp:35-85 the catch-up and its timeout, :110-133 it ends when each other member answered a heartbeat since the win, or failed one, :349-379 the win restarts each heartbeat`,
|
|
4882
5098
|
rung: "implemented"
|
|
4883
5099
|
},
|
|
4884
5100
|
{
|
|
4885
|
-
ref: `${AT$
|
|
5101
|
+
ref: `${AT$8}/topology_coordinator.cpp:3841-3849 and :3910-3932 a restarted heartbeat, and the latest optime that the catch-up waits for`,
|
|
4886
5102
|
rung: "implemented"
|
|
4887
5103
|
},
|
|
4888
5104
|
{
|
|
4889
|
-
ref: `${AT$
|
|
5105
|
+
ref: `${AT$8}/replication_coordinator_impl.cpp:1490-1570 the end of the drain: a reconfig of the term, then writes, :2580-2588 the hello of a primary that cannot write yet`,
|
|
4890
5106
|
rung: "implemented"
|
|
4891
5107
|
},
|
|
4892
5108
|
{
|
|
4893
|
-
ref: `${AT$
|
|
5109
|
+
ref: `${AT$8}/replication_coordinator_impl_step_up_step_down.cpp:64-329 replSetStepDown: the wait for a caught-up secondary, the step-down and the hand-off`,
|
|
4894
5110
|
rung: "implemented"
|
|
4895
5111
|
},
|
|
4896
5112
|
{
|
|
4897
|
-
ref: `${AT$
|
|
5113
|
+
ref: `${AT$8}/repl_set_commands.cpp:545-561 stepDownSecs 60 and secondaryCatchUpPeriodSecs 10`,
|
|
4898
5114
|
rung: "implemented"
|
|
4899
5115
|
},
|
|
4900
5116
|
{
|
|
4901
|
-
ref: `${AT$
|
|
5117
|
+
ref: `${AT$8}/replication_coordinator_impl.idl:18-26 enableElectionHandoff true, and replication_coordinator_impl.cpp:2830-2873 the hand-off: replSetStepUp with skipDryRun`,
|
|
4902
5118
|
rung: "implemented"
|
|
4903
5119
|
},
|
|
4904
5120
|
{
|
|
4905
|
-
ref: `${AT$
|
|
5121
|
+
ref: `${AT$8}/replication_coordinator_impl.cpp:1516 the reconfig of the term, :4598 and :4750 a new config starts each heartbeat again`,
|
|
4906
5122
|
rung: "implemented"
|
|
4907
5123
|
},
|
|
4908
5124
|
{
|
|
4909
|
-
ref: `${AT$
|
|
5125
|
+
ref: `${AT$8}/replication_coordinator_impl_heartbeat.cpp:367-376 a heartbeat response that moves a member's optime forward moves the commit point and wakes the writes that wait`,
|
|
4910
5126
|
rung: "implemented"
|
|
4911
5127
|
},
|
|
4912
5128
|
{
|
|
4913
|
-
ref: `${AT$
|
|
5129
|
+
ref: `${AT$8}/oplog_fetcher.cpp:119-133 the awaitData timeout min(electionTimeoutMillis / 2, 30 s), :317-324 the socket timeout adds oplogNetworkTimeoutBufferSeconds, :640-647 the exhaust read`,
|
|
4914
5130
|
rung: "implemented"
|
|
4915
5131
|
},
|
|
4916
5132
|
{
|
|
4917
|
-
ref: `${AT$
|
|
5133
|
+
ref: `${AT$8}/oplog_fetcher.cpp:395-441 an error makes a new cursor while restarts remain, :596-611 the new cursor sets the retried find timeout, :1073-1113 one restart after 5 ms`,
|
|
4918
5134
|
rung: "implemented"
|
|
4919
5135
|
},
|
|
4920
5136
|
{
|
|
4921
|
-
ref: `${AT$
|
|
5137
|
+
ref: `${AT$8}/repl_server_parameters.idl:121-126 oplogRetriedFindMaxSeconds 2, :234-244 oplogFetcherSteadyStateMaxFetcherRestarts 1, :344-351 oplogNetworkTimeoutBufferSeconds 5`,
|
|
4922
5138
|
rung: "implemented"
|
|
4923
5139
|
},
|
|
4924
5140
|
{
|
|
@@ -4926,19 +5142,19 @@ const MONGOD_REPL = machineSchema.parse({
|
|
|
4926
5142
|
rung: "implemented"
|
|
4927
5143
|
},
|
|
4928
5144
|
{
|
|
4929
|
-
ref: `${AT$
|
|
5145
|
+
ref: `${AT$8}/bgsync.cpp:395-447 a member without a sync source waits for new heartbeat data or 1 s (:971-976), and topology_coordinator.cpp:1124-1136 it sends its heartbeats each 500 ms`,
|
|
4930
5146
|
rung: "implemented"
|
|
4931
5147
|
},
|
|
4932
5148
|
{
|
|
4933
|
-
ref: `${AT$
|
|
5149
|
+
ref: `${AT$8}/replication_coordinator_impl.cpp:4947-4972 a member that loses its sync source starts each heartbeat again at once`,
|
|
4934
5150
|
rung: "implemented"
|
|
4935
5151
|
},
|
|
4936
5152
|
{
|
|
4937
|
-
ref: `${AT$
|
|
5153
|
+
ref: `${AT$8}/sync_source_feedback.cpp:37-47 the keepalive of the reporter min(electionTimeoutMillis / 2, 30 s), :39-40 the network timeout 30 s, :99-117 and :134-236 a new reporter only after the old one ends`,
|
|
4938
5154
|
rung: "implemented"
|
|
4939
5155
|
},
|
|
4940
5156
|
{
|
|
4941
|
-
ref: `${AT$
|
|
5157
|
+
ref: `${AT$8}/reporter.cpp:113-117 a reporter ends when its command in flight ends, :119-169 a trigger, :195-228 each replSetUpdatePosition has the network timeout`,
|
|
4942
5158
|
rung: "implemented"
|
|
4943
5159
|
},
|
|
4944
5160
|
{
|
|
@@ -5557,7 +5773,7 @@ const MONGOD_REPL = machineSchema.parse({
|
|
|
5557
5773
|
});
|
|
5558
5774
|
//#endregion
|
|
5559
5775
|
//#region src/mongo/mongod-session.ts
|
|
5560
|
-
const AT$
|
|
5776
|
+
const AT$7 = "mongodb r9.0.4 src/mongo";
|
|
5561
5777
|
/**
|
|
5562
5778
|
* This document is the hold of mongod 9.0.4 on one client connection, over its socket. `mongod`
|
|
5563
5779
|
* turns keepalive on for each TCP session. It lowers two keepalive options of the socket to a
|
|
@@ -5584,27 +5800,27 @@ const MONGOD_SESSION = machineSchema.parse({
|
|
|
5584
5800
|
},
|
|
5585
5801
|
sources: [
|
|
5586
5802
|
{
|
|
5587
|
-
ref: `${AT$
|
|
5803
|
+
ref: `${AT$7}/transport/asio/asio_session_impl.cpp:156-165 each TCP session: TCP_NODELAY, SO_KEEPALIVE, setSocketKeepAliveParams, failures at debug 3 in a release build`,
|
|
5588
5804
|
rung: "implemented"
|
|
5589
5805
|
},
|
|
5590
5806
|
{
|
|
5591
|
-
ref: `${AT$
|
|
5807
|
+
ref: `${AT$7}/util/net/socket_utils.h:15-16 kMaxKeepIdleSecs 300 and kMaxKeepIntvlSecs 1, :19-22 the defaults of setSocketKeepAliveParams`,
|
|
5592
5808
|
rung: "implemented"
|
|
5593
5809
|
},
|
|
5594
5810
|
{
|
|
5595
|
-
ref: `${AT$
|
|
5811
|
+
ref: `${AT$7}/util/net/socket_utils.cpp:165-196 applyMax: read the option, and set the maximum only when the value is higher, :199-220 TCP_KEEPIDLE and TCP_KEEPINTVL, never TCP_KEEPCNT`,
|
|
5596
5812
|
rung: "implemented"
|
|
5597
5813
|
},
|
|
5598
5814
|
{
|
|
5599
|
-
ref: `${AT$
|
|
5815
|
+
ref: `${AT$7}/util/net/socket_utils.cpp:176-181 and :190-194 the log of a failed read or set, at the severity of the caller`,
|
|
5600
5816
|
rung: "implemented"
|
|
5601
5817
|
},
|
|
5602
5818
|
{
|
|
5603
|
-
ref: `${AT$
|
|
5819
|
+
ref: `${AT$7}/util/net/sock.cpp:135-142 the older socket path: SO_KEEPALIVE, then the same maximums, failures as errors`,
|
|
5604
5820
|
rung: "implemented"
|
|
5605
5821
|
},
|
|
5606
5822
|
{
|
|
5607
|
-
ref: `${AT$
|
|
5823
|
+
ref: `${AT$7}/db/repl/replication_info.cpp:131-143 an awaitable hello waits until now + maxAwaitTimeMS on the precise clock, or a change of the topology`,
|
|
5608
5824
|
rung: "implemented"
|
|
5609
5825
|
}
|
|
5610
5826
|
],
|
|
@@ -5766,7 +5982,7 @@ const MONGOD_SESSION = machineSchema.parse({
|
|
|
5766
5982
|
});
|
|
5767
5983
|
//#endregion
|
|
5768
5984
|
//#region src/mongo/mongodb-node.ts
|
|
5769
|
-
const AT$
|
|
5985
|
+
const AT$6 = "mongodb 7.7.0 src";
|
|
5770
5986
|
/**
|
|
5771
5987
|
* This document is the MongoDB Node driver 7.7.0, for one server of a replica set. It gives one
|
|
5772
5988
|
* connection of the driver by its role, and the timers that act on it. The roles are the monitor
|
|
@@ -5793,75 +6009,75 @@ const MONGODB_NODE = machineSchema.parse({
|
|
|
5793
6009
|
},
|
|
5794
6010
|
sources: [
|
|
5795
6011
|
{
|
|
5796
|
-
ref: `${AT$
|
|
6012
|
+
ref: `${AT$6}/connection_string.ts:804-807 connectTimeoutMS 30000, :850-853 heartbeatFrequencyMS 10000, :934-937 minHeartbeatFrequencyMS 500`,
|
|
5797
6013
|
rung: "implemented"
|
|
5798
6014
|
},
|
|
5799
6015
|
{
|
|
5800
|
-
ref: `${AT$
|
|
6016
|
+
ref: `${AT$6}/connection_string.ts:1100-1103 serverSelectionTimeoutMS 30000, :1107-1111 socketTimeoutMS 0, :1178-1182 waitQueueTimeoutMS 0`,
|
|
5801
6017
|
rung: "implemented"
|
|
5802
6018
|
},
|
|
5803
6019
|
{
|
|
5804
|
-
ref: `${AT$
|
|
6020
|
+
ref: `${AT$6}/connection_string.ts:896-898 maxConnecting 2, :906-908 maxIdleTimeMS 0, :910-912 maxPoolSize 100, :930-933 minPoolSize 0, :1075-1082 retryReads and retryWrites true, :1089-1091 serverMonitoringMode auto`,
|
|
5805
6021
|
rung: "implemented"
|
|
5806
6022
|
},
|
|
5807
6023
|
{
|
|
5808
|
-
ref: `${AT$
|
|
6024
|
+
ref: `${AT$6}/cmap/connect.ts:291 DEFAULT_KEEP_ALIVE_INITIAL_DELAY_MS 120000, :336-338 keepAlive and noDelay, :378-417 makeSocket: setKeepAlive, setNoDelay, setTimeout(connectTimeoutMS), :432-438 the connect timeout`,
|
|
5809
6025
|
rung: "implemented"
|
|
5810
6026
|
},
|
|
5811
6027
|
{
|
|
5812
|
-
ref: `${AT$
|
|
6028
|
+
ref: `${AT$6}/cmap/connect.ts:117-120 the handshake reads with socketTimeoutMS = connectTimeoutMS`,
|
|
5813
6029
|
rung: "implemented"
|
|
5814
6030
|
},
|
|
5815
6031
|
{
|
|
5816
|
-
ref: `${AT$
|
|
6032
|
+
ref: `${AT$6}/sdam/monitor.ts:245-259 the streaming protocol, :338-371 the awaitable hello: maxAwaitTimeMS = heartbeatFrequencyMS, socketTimeoutMS = connectTimeoutMS + maxAwaitTimeMS`,
|
|
5817
6033
|
rung: "implemented"
|
|
5818
6034
|
},
|
|
5819
6035
|
{
|
|
5820
|
-
ref: `${AT$
|
|
6036
|
+
ref: `${AT$6}/sdam/monitor.ts:273-293 a failed heartbeat: ResetPool, and InterruptInUseConnections for a timeout`,
|
|
5821
6037
|
rung: "implemented"
|
|
5822
6038
|
},
|
|
5823
6039
|
{
|
|
5824
|
-
ref: `${AT$
|
|
6040
|
+
ref: `${AT$6}/sdam/monitor.ts:175-194 reset: the next check after heartbeatFrequencyMS, :609-636 wake: no check sooner than minHeartbeatFrequencyMS, :668-691 the next check after heartbeatFrequencyMS`,
|
|
5825
6041
|
rung: "implemented"
|
|
5826
6042
|
},
|
|
5827
6043
|
{
|
|
5828
|
-
ref: `${AT$
|
|
6044
|
+
ref: `${AT$6}/sdam/monitor.ts:490-565 the RTT pinger: its own connection, a hello each heartbeatFrequencyMS, no socket timeout`,
|
|
5829
6045
|
rung: "implemented"
|
|
5830
6046
|
},
|
|
5831
6047
|
{
|
|
5832
|
-
ref: `${AT$
|
|
6048
|
+
ref: `${AT$6}/cmap/connection.ts:328-334 a socket timeout, 1 ms later, is a MongoNetworkTimeoutError, :461-505 the socket timeout of a command, set again at each reply`,
|
|
5833
6049
|
rung: "implemented"
|
|
5834
6050
|
},
|
|
5835
6051
|
{
|
|
5836
|
-
ref: `${AT$
|
|
6052
|
+
ref: `${AT$6}/sdam/server.ts:186 resetServer, :390-444 handleError, :450-515 decorateCommandError, :532-546 markServerUnknown: a network error that is not a timeout resets the monitor`,
|
|
5837
6053
|
rung: "implemented"
|
|
5838
6054
|
},
|
|
5839
6055
|
{
|
|
5840
|
-
ref: `${AT$
|
|
6056
|
+
ref: `${AT$6}/sdam/topology.ts:559 the selection timeout, :568-572 and :635-664 MongoServerSelectionError, :862-888 updateServers clears the pool, :1082-1089 a waiting selection wakes each monitor`,
|
|
5841
6057
|
rung: "implemented"
|
|
5842
6058
|
},
|
|
5843
6059
|
{
|
|
5844
|
-
ref: `${AT$
|
|
6060
|
+
ref: `${AT$6}/sdam/topology_description.ts:458-467 a primary that another primary replaces is Unknown, and nothing clears its pool`,
|
|
5845
6061
|
rung: "implemented"
|
|
5846
6062
|
},
|
|
5847
6063
|
{
|
|
5848
|
-
ref: `${AT$
|
|
6064
|
+
ref: `${AT$6}/cmap/connection_pool.ts:417-468 clear, :475-481 interruptInUseConnections: PoolClearedOnNetworkError, :584 a connection idle for maxIdleTimeMS is perished at the next check-out`,
|
|
5849
6065
|
rung: "implemented"
|
|
5850
6066
|
},
|
|
5851
6067
|
{
|
|
5852
|
-
ref: `${AT$
|
|
6068
|
+
ref: `${AT$6}/cmap/errors.ts:37-84 PoolClearedError and PoolClearedOnNetworkError, with the label PoolRequestedRetry`,
|
|
5853
6069
|
rung: "implemented"
|
|
5854
6070
|
},
|
|
5855
6071
|
{
|
|
5856
|
-
ref: `${AT$
|
|
6072
|
+
ref: `${AT$6}/operations/execute_operation.ts:252-279 two attempts for a retryable read or write, :375-380 the retry selects a server again, :442-445 canRetry`,
|
|
5857
6073
|
rung: "implemented"
|
|
5858
6074
|
},
|
|
5859
6075
|
{
|
|
5860
|
-
ref: `${AT$
|
|
6076
|
+
ref: `${AT$6}/error.ts:1377-1394 the retryable codes, :1431-1436 isRetryableWriteError: RetryableWriteError or PoolRequestedRetry`,
|
|
5861
6077
|
rung: "implemented"
|
|
5862
6078
|
},
|
|
5863
6079
|
{
|
|
5864
|
-
ref: `${AT$
|
|
6080
|
+
ref: `${AT$6}/timeout.ts:362-372 the legacy timeout context: the selection timeout, and no check-out timeout at waitQueueTimeoutMS 0`,
|
|
5865
6081
|
rung: "implemented"
|
|
5866
6082
|
},
|
|
5867
6083
|
{
|
|
@@ -7541,7 +7757,7 @@ const HIKARICP_PGJDBC = machineSchema.parse({
|
|
|
7541
7757
|
});
|
|
7542
7758
|
//#endregion
|
|
7543
7759
|
//#region src/pg/node-postgres.ts
|
|
7544
|
-
const AT$
|
|
7760
|
+
const AT$5 = "pg 8.23.1 lib";
|
|
7545
7761
|
const POOL = "pg-pool 3.14.0";
|
|
7546
7762
|
/**
|
|
7547
7763
|
* This document is node-postgres 8.23.1 (the npm package pg) with pg-pool 3.14.0, for one client
|
|
@@ -7583,75 +7799,75 @@ const NODE_POSTGRES = machineSchema.parse({
|
|
|
7583
7799
|
rung: "implemented"
|
|
7584
7800
|
},
|
|
7585
7801
|
{
|
|
7586
|
-
ref: `${AT$
|
|
7802
|
+
ref: `${AT$5}/defaults.js:42 max 10 and :46 idleTimeoutMillis 30000: no line of pg or pg-pool reads them, thus a pool does not use them`,
|
|
7587
7803
|
rung: "implemented"
|
|
7588
7804
|
},
|
|
7589
7805
|
{
|
|
7590
|
-
ref: `${AT$
|
|
7806
|
+
ref: `${AT$5}/defaults.js:65, :69, :73 and :76 statement_timeout, lock_timeout, idle_in_transaction_session_timeout and query_timeout are false`,
|
|
7591
7807
|
rung: "implemented"
|
|
7592
7808
|
},
|
|
7593
7809
|
{
|
|
7594
|
-
ref: `${AT$
|
|
7810
|
+
ref: `${AT$5}/defaults.js:63-76 the comments of pg: each of the four is in milliseconds, false is no limit, and query_timeout is on the client side`,
|
|
7595
7811
|
rung: "documented"
|
|
7596
7812
|
},
|
|
7597
7813
|
{
|
|
7598
|
-
ref: `${AT$
|
|
7814
|
+
ref: `${AT$5}/connection-parameters.js:9-23 val: the config, else the default of pg, :121-124 the three timeouts of the server and query_timeout, with no environment variable`,
|
|
7599
7815
|
rung: "implemented"
|
|
7600
7816
|
},
|
|
7601
7817
|
{
|
|
7602
|
-
ref: `${AT$
|
|
7818
|
+
ref: `${AT$5}/client.js:89-98 the Connection gets keepAlive false and keepAliveInitialDelayMillis 0 when the config does not give them, :116 connectionTimeoutMillis 0`,
|
|
7603
7819
|
rung: "implemented"
|
|
7604
7820
|
},
|
|
7605
7821
|
{
|
|
7606
|
-
ref: `${AT$
|
|
7822
|
+
ref: `${AT$5}/stream.js:20-24 and :78-83 outside Cloudflare Workers, the socket is a new net.Socket with no option`,
|
|
7607
7823
|
rung: "implemented"
|
|
7608
7824
|
},
|
|
7609
7825
|
{
|
|
7610
|
-
ref: `${AT$
|
|
7826
|
+
ref: `${AT$5}/connection.js:40-52 setNoDelay(true) before the connect, and setKeepAlive(true, keepAliveInitialDelayMillis) at the connect only when keepAlive is true, :54-65 the error and the close of the socket`,
|
|
7611
7827
|
rung: "implemented"
|
|
7612
7828
|
},
|
|
7613
7829
|
{
|
|
7614
|
-
ref: `${AT$
|
|
7830
|
+
ref: `${AT$5}/client.js:167-176 and :702-737 are the only timers of the client, and connection.js has none: the client sends nothing by itself on an idle connection`,
|
|
7615
7831
|
rung: "implemented"
|
|
7616
7832
|
},
|
|
7617
7833
|
{
|
|
7618
|
-
ref: `${AT$
|
|
7834
|
+
ref: `${AT$5}/client.js:153-230 _connect: no second connect, the connect timer of the client ('timeout expired'), and 'Connection terminated unexpectedly' for an end that the client did not ask for`,
|
|
7619
7835
|
rung: "implemented"
|
|
7620
7836
|
},
|
|
7621
7837
|
{
|
|
7622
|
-
ref: `${AT$
|
|
7838
|
+
ref: `${AT$5}/client.js:373-387 the first ReadyForQuery ends the connect and clears the timer, :398-423 an error before it goes to the connect callback, and an error after it makes the client unqueryable`,
|
|
7623
7839
|
rung: "implemented"
|
|
7624
7840
|
},
|
|
7625
7841
|
{
|
|
7626
|
-
ref: `${AT$
|
|
7842
|
+
ref: `${AT$5}/client.js:426-442 an ErrorResponse fails the active query only, and with no active query it is an error of the client`,
|
|
7627
7843
|
rung: "implemented"
|
|
7628
7844
|
},
|
|
7629
7845
|
{
|
|
7630
|
-
ref: `${AT$
|
|
7846
|
+
ref: `${AT$5}/connection.js:137-145 and pg-protocol 1.16.1 dist/parser.js:142-144, :296-323 an ErrorResponse is a DatabaseError, with the severity and the code that the server gives`,
|
|
7631
7847
|
rung: "implemented"
|
|
7632
7848
|
},
|
|
7633
7849
|
{
|
|
7634
|
-
ref: `${AT$
|
|
7850
|
+
ref: `${AT$5}/client.js:133-151 _errorAllQueries: each query of the client fails with the same error, on the next tick`,
|
|
7635
7851
|
rung: "implemented"
|
|
7636
7852
|
},
|
|
7637
7853
|
{
|
|
7638
|
-
ref: `${AT$
|
|
7854
|
+
ref: `${AT$5}/query.js:122-150 a query gives its error or its result to its callback, at the error or at the ReadyForQuery`,
|
|
7639
7855
|
rung: "implemented"
|
|
7640
7856
|
},
|
|
7641
7857
|
{
|
|
7642
|
-
ref: `${AT$
|
|
7858
|
+
ref: `${AT$5}/client.js:702-737 query_timeout: a Node timer for each query, 'Query read timeout'. The client sends no cancel, and it keeps the active query`,
|
|
7643
7859
|
rung: "implemented"
|
|
7644
7860
|
},
|
|
7645
7861
|
{
|
|
7646
|
-
ref: `${AT$
|
|
7862
|
+
ref: `${AT$5}/client.js:616-641 the next query goes only after a ReadyForQuery, :765-777 a query on an unqueryable or ended client fails at once`,
|
|
7647
7863
|
rung: "implemented"
|
|
7648
7864
|
},
|
|
7649
7865
|
{
|
|
7650
|
-
ref: `${AT$
|
|
7866
|
+
ref: `${AT$5}/client.js:799-836 end: a dead socket or an active query destroys the socket, else connection.js:217-227 sends Terminate and ends the socket`,
|
|
7651
7867
|
rung: "implemented"
|
|
7652
7868
|
},
|
|
7653
7869
|
{
|
|
7654
|
-
ref: `${AT$
|
|
7870
|
+
ref: `${AT$5}/client.js:543-572 getStartupConf: statement_timeout, lock_timeout and idle_in_transaction_session_timeout go to the server only when they are set`,
|
|
7655
7871
|
rung: "implemented"
|
|
7656
7872
|
},
|
|
7657
7873
|
{
|
|
@@ -10047,7 +10263,7 @@ const PGPOOL_SESSION = machineSchema.parse({
|
|
|
10047
10263
|
});
|
|
10048
10264
|
//#endregion
|
|
10049
10265
|
//#region src/pg/postgres-session.ts
|
|
10050
|
-
const AT$
|
|
10266
|
+
const AT$4 = "postgresql REL_17_11 src";
|
|
10051
10267
|
const DOC = "postgresql REL_17_11 doc/src/sgml";
|
|
10052
10268
|
/**
|
|
10053
10269
|
* This document is the hold of a PostgreSQL 17.11 backend on one client connection, over its TCP
|
|
@@ -10087,163 +10303,163 @@ const POSTGRES_SESSION = machineSchema.parse({
|
|
|
10087
10303
|
rung: "implemented"
|
|
10088
10304
|
},
|
|
10089
10305
|
{
|
|
10090
|
-
ref: `${AT$
|
|
10306
|
+
ref: `${AT$4}/backend/tcop/backend_startup.c:157-161 BackendInitialize calls pq_init in the backend, before the startup packet`,
|
|
10091
10307
|
rung: "implemented"
|
|
10092
10308
|
},
|
|
10093
10309
|
{
|
|
10094
|
-
ref: `${AT$
|
|
10310
|
+
ref: `${AT$4}/backend/libpq/pqcomm.c:793-817 AcceptConnection in the postmaster, :180 the Port starts at zeros, :195-220 TCP_NODELAY and SO_KEEPALIVE on each socket that is not AF_UNIX, a failure is FATAL, :264-274 then the four TCP GUCs, a failure is a LOG only`,
|
|
10095
10311
|
rung: "implemented"
|
|
10096
10312
|
},
|
|
10097
10313
|
{
|
|
10098
|
-
ref: `${AT$
|
|
10314
|
+
ref: `${AT$4}/backend/libpq/pqcomm.c:1663-1711 pq_setkeepalivesidle: no call at a value equal to the Port's, and 0 sets the value that getsockopt read first; :1748-1795, :1827-1870 and :1902-1945 the same for TCP_KEEPINTVL, TCP_KEEPCNT and TCP_USER_TIMEOUT`,
|
|
10099
10315
|
rung: "implemented"
|
|
10100
10316
|
},
|
|
10101
10317
|
{
|
|
10102
|
-
ref: `${AT$
|
|
10318
|
+
ref: `${AT$4}/backend/libpq/pqcomm.c:87-90 TCP_KEEPIDLE on Linux, :1947-2047 an assign hook sets the socket of the session at once, and a show hook reads the kernel`,
|
|
10103
10319
|
rung: "implemented"
|
|
10104
10320
|
},
|
|
10105
10321
|
{
|
|
10106
|
-
ref: `${AT$
|
|
10322
|
+
ref: `${AT$4}/backend/utils/misc/guc_tables.c:3452-3461 tcp_keepalives_idle 0 s, :3463-3472 tcp_keepalives_interval 0 s, :3485-3495 tcp_keepalives_count 0, :3587-3596 tcp_user_timeout 0 ms: each PGC_USERSET, 0 to INT_MAX, 0 is the system default`,
|
|
10107
10323
|
rung: "implemented"
|
|
10108
10324
|
},
|
|
10109
10325
|
{
|
|
10110
|
-
ref: `${AT$
|
|
10326
|
+
ref: `${AT$4}/backend/utils/misc/guc_tables.c:2611-2620 statement_timeout, :2622-2631 lock_timeout, :2633-2642 idle_in_transaction_session_timeout, :2644-2653 transaction_timeout, :2655-2664 idle_session_timeout: each 0 ms, 0 to INT_MAX, PGC_USERSET, 0 turns it off`,
|
|
10111
10327
|
rung: "implemented"
|
|
10112
10328
|
},
|
|
10113
10329
|
{
|
|
10114
|
-
ref: `${AT$
|
|
10330
|
+
ref: `${AT$4}/backend/utils/misc/guc_tables.c:2774-2783 authentication_timeout 60 s, 1 to 600, PGC_SIGHUP; :3632-3641 client_connection_check_interval 0 ms, 0 to INT_MAX, PGC_USERSET`,
|
|
10115
10331
|
rung: "implemented"
|
|
10116
10332
|
},
|
|
10117
10333
|
{
|
|
10118
|
-
ref: `${AT$
|
|
10334
|
+
ref: `${AT$4}/backend/storage/lmgr/proc.c:58-62, backend/tcop/postgres.c:106 and backend/postmaster/postmaster.c:228 the C defaults agree: 0 ms for each timeout, 0 ms for the client check, 60 s for authentication`,
|
|
10119
10335
|
rung: "implemented"
|
|
10120
10336
|
},
|
|
10121
10337
|
{
|
|
10122
|
-
ref: `${AT$
|
|
10338
|
+
ref: `${AT$4}/include/utils/timeout.h:3-4 and :23-43 one SIGALRM for each timeout id, STARTUP_PACKET_TIMEOUT to CLIENT_CONNECTION_CHECK_TIMEOUT`,
|
|
10123
10339
|
rung: "implemented"
|
|
10124
10340
|
},
|
|
10125
10341
|
{
|
|
10126
|
-
ref: `${AT$
|
|
10342
|
+
ref: `${AT$4}/backend/utils/misc/timeout.c:559-575 enable_timeout_after: the deadline is the current time + the delay in ms, :209-350 schedule_alarm: setitimer(ITIMER_REAL) for the nearest deadline, :363-453 handle_sig_alarm sets the latch and calls each handler that is due`,
|
|
10127
10343
|
rung: "implemented"
|
|
10128
10344
|
},
|
|
10129
10345
|
{
|
|
10130
|
-
ref: `${AT$
|
|
10346
|
+
ref: `${AT$4}/backend/utils/init/postinit.c:770-782 the handlers of a backend, :1374-1407 the statement timer sends SIGINT, or SIGTERM in authentication, and the lock timer sends SIGINT, :1409-1447 each other handler sets a flag and the latch`,
|
|
10131
10347
|
rung: "implemented"
|
|
10132
10348
|
},
|
|
10133
10349
|
{
|
|
10134
|
-
ref: `${AT$
|
|
10350
|
+
ref: `${AT$4}/backend/tcop/postgres.c:2999-3023 die (SIGTERM) sets ProcDiePending, :3029-3043 StatementCancelHandler (SIGINT) sets QueryCancelPending, :4292-4294 the two handlers`,
|
|
10135
10351
|
rung: "implemented"
|
|
10136
10352
|
},
|
|
10137
10353
|
{
|
|
10138
|
-
ref: `${AT$
|
|
10354
|
+
ref: `${AT$4}/backend/tcop/postgres.c:3271-3319 ProcessInterrupts acts on a die request first: FATAL 57014 "canceling authentication due to timeout" in authentication, else FATAL 57P01 "terminating connection due to administrator command"`,
|
|
10139
10355
|
rung: "implemented"
|
|
10140
10356
|
},
|
|
10141
10357
|
{
|
|
10142
|
-
ref: `${AT$
|
|
10358
|
+
ref: `${AT$4}/backend/tcop/postgres.c:3321-3350 then the client check, then a lost connection: FATAL 08006 "connection to client lost", with no message to the client`,
|
|
10143
10359
|
rung: "implemented"
|
|
10144
10360
|
},
|
|
10145
10361
|
{
|
|
10146
|
-
ref: `${AT$
|
|
10362
|
+
ref: `${AT$4}/backend/tcop/postgres.c:3372-3430 a cancel: ERROR 55P03 "canceling statement due to lock timeout", ERROR 57014 "canceling statement due to statement timeout"`,
|
|
10147
10363
|
rung: "implemented"
|
|
10148
10364
|
},
|
|
10149
10365
|
{
|
|
10150
|
-
ref: `${AT$
|
|
10366
|
+
ref: `${AT$4}/backend/tcop/postgres.c:3435-3477 FATAL 25P03 "terminating connection due to idle-in-transaction timeout", FATAL 25P04 "terminating connection due to transaction timeout", FATAL 57P05 "terminating connection due to idle-session timeout"`,
|
|
10151
10367
|
rung: "implemented"
|
|
10152
10368
|
},
|
|
10153
10369
|
{
|
|
10154
|
-
ref: `${AT$
|
|
10370
|
+
ref: `${AT$4}/backend/utils/errcodes.txt:106-107 08003 and 08006, :111 08P01, :254-255 25P03 and 25P04, :421 55P03, :428-429 57014 and 57P01, :433 57P05`,
|
|
10155
10371
|
rung: "implemented"
|
|
10156
10372
|
},
|
|
10157
10373
|
{
|
|
10158
|
-
ref: `${AT$
|
|
10374
|
+
ref: `${AT$4}/backend/tcop/postgres.c:4618-4706 at ReadyForQuery the backend arms idle_in_transaction_session_timeout in a transaction block, open or aborted, and idle_session_timeout outside one; :4714-4750 after a message it disarms them, then checks for interrupts`,
|
|
10159
10375
|
rung: "implemented"
|
|
10160
10376
|
},
|
|
10161
10377
|
{
|
|
10162
|
-
ref: `${AT$
|
|
10378
|
+
ref: `${AT$4}/backend/tcop/postgres.c:2770-2796 start_xact_command arms statement_timeout and the client check, each only when not active, :2798-2802 finish_xact_command disarms statement_timeout, :5251-5278 no statement timer when statement_timeout >= transaction_timeout > 0`,
|
|
10163
10379
|
rung: "implemented"
|
|
10164
10380
|
},
|
|
10165
10381
|
{
|
|
10166
|
-
ref: `${AT$
|
|
10382
|
+
ref: `${AT$4}/backend/utils/adt/misc.c:391-412 pg_sleep: CHECK_FOR_INTERRUPTS before each WaitLatch on the latch of the backend, thus the SIGALRM of a timeout ends its wait`,
|
|
10167
10383
|
rung: "implemented"
|
|
10168
10384
|
},
|
|
10169
10385
|
{
|
|
10170
|
-
ref: `${AT$
|
|
10386
|
+
ref: `${AT$4}/backend/tcop/postgres.c:4446-4502 an ERROR: disable_all_timeouts, the error to the client, AbortCurrentTransaction; :4562-4563 then ReadyForQuery`,
|
|
10171
10387
|
rung: "implemented"
|
|
10172
10388
|
},
|
|
10173
10389
|
{
|
|
10174
|
-
ref: `${AT$
|
|
10390
|
+
ref: `${AT$4}/backend/access/transam/xact.c:2174-2176 StartTransaction arms transaction_timeout, :2315-2317, :2592-2594 and :2768-2770 commit, prepare and abort disarm it, :3472-3477 an error in a transaction block aborts the transaction and keeps the block`,
|
|
10175
10391
|
rung: "implemented"
|
|
10176
10392
|
},
|
|
10177
10393
|
{
|
|
10178
|
-
ref: `${AT$
|
|
10394
|
+
ref: `${AT$4}/backend/storage/lmgr/proc.c:1292-1307 ProcSleep arms lock_timeout with the deadlock timer, :1652-1666 and disarms it after the wait`,
|
|
10179
10395
|
rung: "implemented"
|
|
10180
10396
|
},
|
|
10181
10397
|
{
|
|
10182
|
-
ref: `${AT$
|
|
10398
|
+
ref: `${AT$4}/backend/tcop/postgres.c:3652-3661 a client_connection_check_interval above 0 needs a wait set that reports a close`,
|
|
10183
10399
|
rung: "implemented"
|
|
10184
10400
|
},
|
|
10185
10401
|
{
|
|
10186
|
-
ref: `${AT$
|
|
10402
|
+
ref: `${AT$4}/backend/libpq/pqcomm.c:2049-2084 pq_check_connection: a wait of 0 ms for WL_SOCKET_CLOSED`,
|
|
10187
10403
|
rung: "implemented"
|
|
10188
10404
|
},
|
|
10189
10405
|
{
|
|
10190
|
-
ref: `${AT$
|
|
10406
|
+
ref: `${AT$4}/backend/storage/ipc/latch.c:72-85 epoll where sys/epoll.h exists, :1131-1156 WL_SOCKET_CLOSED adds EPOLLRDHUP, and EPOLLERR and EPOLLHUP are always on, :1661-1680 EPOLLERR or EPOLLHUP make the socket readable, writable and closed, :2253-2263 epoll can report a close`,
|
|
10191
10407
|
rung: "implemented"
|
|
10192
10408
|
},
|
|
10193
10409
|
{
|
|
10194
|
-
ref: `${AT$
|
|
10410
|
+
ref: `${AT$4}/backend/libpq/be-secure.c:174-261 secure_read and :300-370 secure_write: a wait for the socket or the latch with no timeout; at the latch, ProcessClientReadInterrupt or ProcessClientWriteInterrupt; :234-237 and :343-346 FATAL 57P01 at the death of the postmaster`,
|
|
10195
10411
|
rung: "implemented"
|
|
10196
10412
|
},
|
|
10197
10413
|
{
|
|
10198
|
-
ref: `${AT$
|
|
10414
|
+
ref: `${AT$4}/backend/tcop/postgres.c:513-548 ProcessClientReadInterrupt: each interrupt in the wait for a command, a die request in another read; :559-600 ProcessClientWriteInterrupt: a die request only, with no message to the client`,
|
|
10199
10415
|
rung: "implemented"
|
|
10200
10416
|
},
|
|
10201
10417
|
{
|
|
10202
|
-
ref: `${AT$
|
|
10418
|
+
ref: `${AT$4}/backend/libpq/pqcomm.c:287-297 the socket has O_NONBLOCK, and the latch gives the waits; :896-956 pq_recvbuf: 0 bytes or an error is EOF, and an error logs COMMERROR "could not receive data from client: %m"`,
|
|
10203
10419
|
rung: "implemented"
|
|
10204
10420
|
},
|
|
10205
10421
|
{
|
|
10206
|
-
ref: `${AT$
|
|
10422
|
+
ref: `${AT$4}/backend/tcop/postgres.c:364-396 SocketBackend: EOF in a transaction logs COMMERROR 08006 "unexpected EOF on client connection with an open transaction", else DEBUG1 08003; :4988-5016 EOF or Terminate: proc_exit(0)`,
|
|
10207
10423
|
rung: "implemented"
|
|
10208
10424
|
},
|
|
10209
10425
|
{
|
|
10210
|
-
ref: `${AT$
|
|
10426
|
+
ref: `${AT$4}/backend/access/transam/xact.c:383-396 IsTransactionState is TRANS_INPROGRESS only; backend/utils/init/postinit.c:1360-1371 ShutdownPostgres aborts the transaction at exit`,
|
|
10211
10427
|
rung: "implemented"
|
|
10212
10428
|
},
|
|
10213
10429
|
{
|
|
10214
|
-
ref: `${AT$
|
|
10430
|
+
ref: `${AT$4}/backend/libpq/pqcomm.c:1275-1336 a full buffer flushes, and the flush waits for the socket, :1358-1423 internal_flush_buffer: an error logs COMMERROR "could not send data to client: %m" once for each errno, drops the buffer and sets ClientConnectionLost`,
|
|
10215
10431
|
rung: "implemented"
|
|
10216
10432
|
},
|
|
10217
10433
|
{
|
|
10218
|
-
ref: `${AT$
|
|
10434
|
+
ref: `${AT$4}/backend/tcop/postgres.c:4310-4316 the backend ignores SIGPIPE`,
|
|
10219
10435
|
rung: "implemented"
|
|
10220
10436
|
},
|
|
10221
10437
|
{
|
|
10222
|
-
ref: `${AT$
|
|
10438
|
+
ref: `${AT$4}/include/utils/elog.h:31-38 COMMERROR is LOG_SERVER_ONLY; backend/utils/error/elog.c:205-228 it goes to the log at log_min_messages WARNING (guc_tables.c:534), and DEBUG1 does not`,
|
|
10223
10439
|
rung: "implemented"
|
|
10224
10440
|
},
|
|
10225
10441
|
{
|
|
10226
|
-
ref: `${AT$
|
|
10442
|
+
ref: `${AT$4}/backend/utils/error/elog.c:245-262 and :1726-1732 an error goes to the client while the output is DestRemote, :3643-3651 the backend flushes it, :559-590 FATAL ends the process with proc_exit(1)`,
|
|
10227
10443
|
rung: "implemented"
|
|
10228
10444
|
},
|
|
10229
10445
|
{
|
|
10230
|
-
ref: `${AT$
|
|
10446
|
+
ref: `${AT$4}/backend/libpq/pqcomm.c:347-392 socket_close keeps the socket open until the process exits`,
|
|
10231
10447
|
rung: "implemented"
|
|
10232
10448
|
},
|
|
10233
10449
|
{
|
|
10234
|
-
ref: `${AT$
|
|
10450
|
+
ref: `${AT$4}/backend/tcop/backend_startup.c:237-253 the startup timer: authentication_timeout, after the DNS lookup, :311-314 the end of the startup packet disarms it, :895-922 its handler and SIGTERM call _exit(1), with no log and no message`,
|
|
10235
10451
|
rung: "implemented"
|
|
10236
10452
|
},
|
|
10237
10453
|
{
|
|
10238
|
-
ref: `${AT$
|
|
10454
|
+
ref: `${AT$4}/backend/tcop/backend_startup.c:460-519 ProcessStartupPacket: no byte is a silent end, a part of a packet logs COMMERROR 08P01 "incomplete startup packet"; :328-333 proc_exit(0)`,
|
|
10239
10455
|
rung: "implemented"
|
|
10240
10456
|
},
|
|
10241
10457
|
{
|
|
10242
|
-
ref: `${AT$
|
|
10458
|
+
ref: `${AT$4}/backend/utils/init/postinit.c:235-251 PerformAuthentication arms the statement timer at authentication_timeout * 1000 ms, :305 ClientAuthInProgress ends after it, :1210-1215 the GUCs of the startup packet apply after it`,
|
|
10243
10459
|
rung: "implemented"
|
|
10244
10460
|
},
|
|
10245
10461
|
{
|
|
10246
|
-
ref: `${AT$
|
|
10462
|
+
ref: `${AT$4}/backend/libpq/auth.c:260-271 an EOF from the client in authentication: proc_exit(0), with no log; :714-744 recv_password_packet gives an EOF as NULL`,
|
|
10247
10463
|
rung: "implemented"
|
|
10248
10464
|
},
|
|
10249
10465
|
{
|
|
@@ -12271,6 +12487,367 @@ const PROCEDURES_WS_SERVER = machineSchema.parse({
|
|
|
12271
12487
|
}
|
|
12272
12488
|
});
|
|
12273
12489
|
//#endregion
|
|
12490
|
+
//#region src/proxy/caddy.ts
|
|
12491
|
+
const AT$3 = "caddy v2.11.7";
|
|
12492
|
+
const XNET = "x/net v0.59.0";
|
|
12493
|
+
/**
|
|
12494
|
+
* This document is Caddy 2.11.7 as an HTTP/2 proxy of gRPC, for one connection of a client. Its
|
|
12495
|
+
* configuration is the one of the harness: one server of h1 and h2c, and `reverse_proxy` to one upstream
|
|
12496
|
+
* of h2c. Each other option is at its default.
|
|
12497
|
+
*
|
|
12498
|
+
* With no stream open for 5 min, Caddy sends GOAWAY NO_ERROR, and it closes the connection 1 s later. A
|
|
12499
|
+
* PING of the client does not reset that timer. Before the headers of a response, a failure of the
|
|
12500
|
+
* upstream gives 502, thus UNAVAILABLE. After them, Caddy resets the stream with INTERNAL_ERROR. Caddy
|
|
12501
|
+
* sends no PING. At SIGTERM it sends GOAWAY at once, and it waits for each stream at its defaults.
|
|
12502
|
+
*/
|
|
12503
|
+
const CADDY_HTTP2 = machineSchema.parse({
|
|
12504
|
+
format: "mark1russell7.machine/1",
|
|
12505
|
+
id: "caddy-http2",
|
|
12506
|
+
title: "Caddy 2.11.7 as an HTTP/2 proxy of gRPC: one connection of a client, its idle close, its replies to a failure of the upstream and its stop",
|
|
12507
|
+
layer: "proxy",
|
|
12508
|
+
version: "2.11.7",
|
|
12509
|
+
conditions: {
|
|
12510
|
+
caddy: "v2.11.7",
|
|
12511
|
+
http2: "golang.org/x/net v0.59.0",
|
|
12512
|
+
go: "1.26.8",
|
|
12513
|
+
configuration: "one server with the protocols h1 and h2c, and reverse_proxy to one upstream of h2c, at the defaults"
|
|
12514
|
+
},
|
|
12515
|
+
sources: [
|
|
12516
|
+
{
|
|
12517
|
+
ref: `${AT$3} modules/caddyhttp/app.go:404-418, :925-940 the defaults of a server: idle_timeout 5 min, read_header_timeout 1 min, read_idle_timeout 1 min, write_idle_timeout 1 min`,
|
|
12518
|
+
rung: "implemented"
|
|
12519
|
+
},
|
|
12520
|
+
{
|
|
12521
|
+
ref: `${AT$3} modules/caddyhttp/app.go:520-533 the protocol h2c: http2.ConfigureServer with a zero http2.Server of ${XNET}`,
|
|
12522
|
+
rung: "implemented"
|
|
12523
|
+
},
|
|
12524
|
+
{
|
|
12525
|
+
ref: `${XNET} xs:166-171 the idle timeout of HTTP/2 is the IdleTimeout of the http.Server`,
|
|
12526
|
+
rung: "implemented"
|
|
12527
|
+
},
|
|
12528
|
+
{
|
|
12529
|
+
ref: `${XNET} xs:812-815, :872-874, :1274-1281, :1578-1581, :1906 the idle timer runs only with no stream open. Its end sends GOAWAY NO_ERROR, and with no stream open the connection closes goAwayTimeout (1 s) later`,
|
|
12530
|
+
rung: "implemented"
|
|
12531
|
+
},
|
|
12532
|
+
{
|
|
12533
|
+
ref: `${XNET} xs:1336 a PING of the client gets an ACK only: it does not reset the idle timer`,
|
|
12534
|
+
rung: "implemented"
|
|
12535
|
+
},
|
|
12536
|
+
{
|
|
12537
|
+
ref: `${XNET} xs:817-820 the server sends no PING: Caddy sets no SendPingTimeout`,
|
|
12538
|
+
rung: "implemented"
|
|
12539
|
+
},
|
|
12540
|
+
{
|
|
12541
|
+
ref: `${AT$3} modules/caddyhttp/reverseproxy/reverseproxy.go:1086, :1107-1112, :1393-1397, :1667-1697 a failure of the upstream before the headers of a response: no retry at the defaults, and statusError gives 502`,
|
|
12542
|
+
rung: "implemented"
|
|
12543
|
+
},
|
|
12544
|
+
{
|
|
12545
|
+
ref: `${AT$3} modules/caddyhttp/reverseproxy/reverseproxy.go:1331-1352 and ${XNET} xs:2296-2310 after the headers, a failed copy panics with http.ErrAbortHandler, and the stream gets RST_STREAM INTERNAL_ERROR`,
|
|
12546
|
+
rung: "implemented"
|
|
12547
|
+
},
|
|
12548
|
+
{
|
|
12549
|
+
ref: `${AT$3} modules/caddyhttp/reverseproxy/httptransport.go:212-226 the defaults of the transport: a dial timeout of 3 s, and an idle upstream connection closes after 2 min`,
|
|
12550
|
+
rung: "implemented"
|
|
12551
|
+
},
|
|
12552
|
+
{
|
|
12553
|
+
ref: `${XNET} xt:550-554, :786-802 an idle connection of the client of HTTP/2 closes with no GOAWAY`,
|
|
12554
|
+
rung: "implemented"
|
|
12555
|
+
},
|
|
12556
|
+
{
|
|
12557
|
+
ref: `${AT$3} modules/caddyhttp/app.go:136-142, :753-799, :862-876 a stop calls Shutdown on each server: a GOAWAY at once, and the grace period is eternal at the defaults. Caddy closes no connection by itself`,
|
|
12558
|
+
rung: "implemented"
|
|
12559
|
+
},
|
|
12560
|
+
{
|
|
12561
|
+
ref: `${AT$3} modules/caddyhttp/app.go:570-577 and go1.26.8 src/net/tcpsock.go:291-296 each accepted socket gets the TCP keepalive of Go: 15 s, 15 s and 9 probes`,
|
|
12562
|
+
rung: "implemented"
|
|
12563
|
+
}
|
|
12564
|
+
],
|
|
12565
|
+
states: {
|
|
12566
|
+
"[none]": {
|
|
12567
|
+
initial: true,
|
|
12568
|
+
pseudo: true,
|
|
12569
|
+
note: "Before the accept of the connection of the client"
|
|
12570
|
+
},
|
|
12571
|
+
idle: { note: "The connection of the client, with no stream open. The idle timer runs" },
|
|
12572
|
+
active: { note: "A stream of the client is open: its request goes to the upstream" },
|
|
12573
|
+
closing: { note: "After a GOAWAY with no stream open, until the close goAwayTimeout later" },
|
|
12574
|
+
draining: { note: "After the GOAWAY of a stop, while a stream is open" },
|
|
12575
|
+
ended: {
|
|
12576
|
+
final: true,
|
|
12577
|
+
note: "The connection of the client closed"
|
|
12578
|
+
}
|
|
12579
|
+
},
|
|
12580
|
+
events: {
|
|
12581
|
+
"local.accept": {
|
|
12582
|
+
kind: "local",
|
|
12583
|
+
note: "The listener accepts the connection of the client, with the TCP keepalive of Go"
|
|
12584
|
+
},
|
|
12585
|
+
"rx.headers": {
|
|
12586
|
+
kind: "rx",
|
|
12587
|
+
note: "The headers of a new stream of the client: a call"
|
|
12588
|
+
},
|
|
12589
|
+
"upstream.end": {
|
|
12590
|
+
kind: "local",
|
|
12591
|
+
note: "The response of the upstream ends with its status: the last stream closes"
|
|
12592
|
+
},
|
|
12593
|
+
"upstream.reset": {
|
|
12594
|
+
kind: "local",
|
|
12595
|
+
note: "The upstream connection ends with a reset or an end of file while the stream waits"
|
|
12596
|
+
},
|
|
12597
|
+
"timer.idle": {
|
|
12598
|
+
kind: "timer",
|
|
12599
|
+
note: "No stream open for idle_timeout"
|
|
12600
|
+
},
|
|
12601
|
+
"timer.goaway": {
|
|
12602
|
+
kind: "timer",
|
|
12603
|
+
note: "goAwayTimeout after the GOAWAY, with no stream open"
|
|
12604
|
+
},
|
|
12605
|
+
"app.stop": {
|
|
12606
|
+
kind: "app",
|
|
12607
|
+
note: "SIGTERM or SIGINT to the process of Caddy"
|
|
12608
|
+
},
|
|
12609
|
+
"peer.fin": {
|
|
12610
|
+
kind: "peer",
|
|
12611
|
+
note: "The client ends the connection"
|
|
12612
|
+
},
|
|
12613
|
+
"peer.rst": {
|
|
12614
|
+
kind: "peer",
|
|
12615
|
+
note: "A reset of the connection of the client"
|
|
12616
|
+
},
|
|
12617
|
+
"tx.status": {
|
|
12618
|
+
kind: "tx",
|
|
12619
|
+
note: "An HTTP status with no gRPC status, before the headers of a response: 502"
|
|
12620
|
+
},
|
|
12621
|
+
"tx.rst-stream": {
|
|
12622
|
+
kind: "tx",
|
|
12623
|
+
note: "RST_STREAM INTERNAL_ERROR of a stream whose response headers went out"
|
|
12624
|
+
},
|
|
12625
|
+
"tx.goaway": {
|
|
12626
|
+
kind: "tx",
|
|
12627
|
+
note: "A GOAWAY NO_ERROR to the client"
|
|
12628
|
+
},
|
|
12629
|
+
"tx.fin": {
|
|
12630
|
+
kind: "tx",
|
|
12631
|
+
note: "The close of the connection of the client: a FIN"
|
|
12632
|
+
}
|
|
12633
|
+
},
|
|
12634
|
+
knobs: {
|
|
12635
|
+
idle_timeout: {
|
|
12636
|
+
key: "servers.idle_timeout",
|
|
12637
|
+
scope: "server",
|
|
12638
|
+
unit: "s",
|
|
12639
|
+
default: 300,
|
|
12640
|
+
note: "app.go:404-406, :925: 5 min. A negative value turns it off"
|
|
12641
|
+
},
|
|
12642
|
+
goaway_timeout: {
|
|
12643
|
+
key: "goAwayTimeout of x/net http2",
|
|
12644
|
+
scope: "server",
|
|
12645
|
+
unit: "s",
|
|
12646
|
+
default: 1,
|
|
12647
|
+
note: "xs: a constant of 1 s"
|
|
12648
|
+
},
|
|
12649
|
+
upstream_idle_timeout: {
|
|
12650
|
+
key: "reverse_proxy transport http keepalive",
|
|
12651
|
+
scope: "server",
|
|
12652
|
+
unit: "s",
|
|
12653
|
+
default: 120,
|
|
12654
|
+
note: "httptransport.go:215-217: 2 min"
|
|
12655
|
+
},
|
|
12656
|
+
keepidle: {
|
|
12657
|
+
key: "the TCP keepalive idle of an accepted connection",
|
|
12658
|
+
scope: "server",
|
|
12659
|
+
unit: "s",
|
|
12660
|
+
default: 15,
|
|
12661
|
+
note: "go1.26.8 dial.go: the default of Go"
|
|
12662
|
+
},
|
|
12663
|
+
keepintvl: {
|
|
12664
|
+
key: "the TCP keepalive interval of an accepted connection",
|
|
12665
|
+
scope: "server",
|
|
12666
|
+
unit: "s",
|
|
12667
|
+
default: 15,
|
|
12668
|
+
note: "go1.26.8 dial.go"
|
|
12669
|
+
},
|
|
12670
|
+
keepcnt: {
|
|
12671
|
+
key: "the TCP keepalive count of an accepted connection",
|
|
12672
|
+
scope: "server",
|
|
12673
|
+
unit: "count",
|
|
12674
|
+
default: 9,
|
|
12675
|
+
note: "go1.26.8 dial.go"
|
|
12676
|
+
},
|
|
12677
|
+
slack: {
|
|
12678
|
+
key: "the lateness of the scheduler of Go for one step",
|
|
12679
|
+
scope: "process",
|
|
12680
|
+
unit: "s",
|
|
12681
|
+
default: .01,
|
|
12682
|
+
note: "An assumption of this document, not a value of Caddy"
|
|
12683
|
+
},
|
|
12684
|
+
hz: {
|
|
12685
|
+
key: "CONFIG_HZ",
|
|
12686
|
+
scope: "global",
|
|
12687
|
+
unit: "Hz",
|
|
12688
|
+
default: null,
|
|
12689
|
+
note: "The build option of the kernel"
|
|
12690
|
+
}
|
|
12691
|
+
},
|
|
12692
|
+
timers: {
|
|
12693
|
+
idle: {
|
|
12694
|
+
duration: {
|
|
12695
|
+
knob: "idle_timeout",
|
|
12696
|
+
unit: "s"
|
|
12697
|
+
},
|
|
12698
|
+
lateness: {
|
|
12699
|
+
knob: "slack",
|
|
12700
|
+
unit: "s"
|
|
12701
|
+
},
|
|
12702
|
+
arms: ["enter:idle"],
|
|
12703
|
+
cancels: ["rx.headers"],
|
|
12704
|
+
fires: "timer.idle",
|
|
12705
|
+
note: "xs:812-815, :1906: from the close of the last stream. A PING does not arm it again"
|
|
12706
|
+
},
|
|
12707
|
+
goaway: {
|
|
12708
|
+
duration: {
|
|
12709
|
+
knob: "goaway_timeout",
|
|
12710
|
+
unit: "s"
|
|
12711
|
+
},
|
|
12712
|
+
lateness: {
|
|
12713
|
+
knob: "slack",
|
|
12714
|
+
unit: "s"
|
|
12715
|
+
},
|
|
12716
|
+
arms: ["tx.goaway"],
|
|
12717
|
+
fires: "timer.goaway",
|
|
12718
|
+
note: "xs:1274-1281: the close after the GOAWAY, when no stream is open"
|
|
12719
|
+
}
|
|
12720
|
+
},
|
|
12721
|
+
transitions: [
|
|
12722
|
+
{
|
|
12723
|
+
id: "cd.accept",
|
|
12724
|
+
from: "[none]",
|
|
12725
|
+
to: "idle",
|
|
12726
|
+
on: "local.accept",
|
|
12727
|
+
timer: "idle",
|
|
12728
|
+
source: "app.go:570-577"
|
|
12729
|
+
},
|
|
12730
|
+
{
|
|
12731
|
+
id: "cd.stream",
|
|
12732
|
+
from: "idle",
|
|
12733
|
+
to: "active",
|
|
12734
|
+
on: "rx.headers",
|
|
12735
|
+
source: "xs:1578-1581"
|
|
12736
|
+
},
|
|
12737
|
+
{
|
|
12738
|
+
id: "cd.replied",
|
|
12739
|
+
from: "active",
|
|
12740
|
+
to: "idle",
|
|
12741
|
+
on: "upstream.end",
|
|
12742
|
+
timer: "idle",
|
|
12743
|
+
note: "The status of the upstream passes to the client unchanged",
|
|
12744
|
+
source: "xs:1906"
|
|
12745
|
+
},
|
|
12746
|
+
{
|
|
12747
|
+
id: "cd.upstream-reset",
|
|
12748
|
+
from: "active",
|
|
12749
|
+
to: "idle",
|
|
12750
|
+
on: "upstream.reset",
|
|
12751
|
+
guard: "no headers of the response went to the client",
|
|
12752
|
+
errno: "UNAVAILABLE",
|
|
12753
|
+
emits: ["tx.status"],
|
|
12754
|
+
note: "502 with no gRPC status, thus UNAVAILABLE Received HTTP status code 502. No retry",
|
|
12755
|
+
source: "reverseproxy.go:1393-1397, :1667-1697"
|
|
12756
|
+
},
|
|
12757
|
+
{
|
|
12758
|
+
id: "cd.upstream-reset-streaming",
|
|
12759
|
+
from: "active",
|
|
12760
|
+
to: "idle",
|
|
12761
|
+
on: "upstream.reset",
|
|
12762
|
+
guard: "the headers of the response went to the client",
|
|
12763
|
+
errno: "INTERNAL",
|
|
12764
|
+
emits: ["tx.rst-stream"],
|
|
12765
|
+
source: "reverseproxy.go:1331-1352"
|
|
12766
|
+
},
|
|
12767
|
+
{
|
|
12768
|
+
id: "cd.idle",
|
|
12769
|
+
from: "idle",
|
|
12770
|
+
to: "closing",
|
|
12771
|
+
on: "timer.idle",
|
|
12772
|
+
timer: "idle",
|
|
12773
|
+
emits: ["tx.goaway"],
|
|
12774
|
+
note: "GOAWAY NO_ERROR, with the highest stream of the client",
|
|
12775
|
+
source: "xs:872-874"
|
|
12776
|
+
},
|
|
12777
|
+
{
|
|
12778
|
+
id: "cd.closed",
|
|
12779
|
+
from: "closing",
|
|
12780
|
+
to: "ended",
|
|
12781
|
+
on: "timer.goaway",
|
|
12782
|
+
timer: "goaway",
|
|
12783
|
+
emits: ["tx.fin"],
|
|
12784
|
+
source: "xs:1274-1281"
|
|
12785
|
+
},
|
|
12786
|
+
{
|
|
12787
|
+
id: "cd.stop-idle",
|
|
12788
|
+
from: "idle",
|
|
12789
|
+
to: "closing",
|
|
12790
|
+
on: "app.stop",
|
|
12791
|
+
emits: ["tx.goaway"],
|
|
12792
|
+
source: "app.go:782-799, xs:1315-1340"
|
|
12793
|
+
},
|
|
12794
|
+
{
|
|
12795
|
+
id: "cd.stop-active",
|
|
12796
|
+
from: "active",
|
|
12797
|
+
to: "draining",
|
|
12798
|
+
on: "app.stop",
|
|
12799
|
+
emits: ["tx.goaway"],
|
|
12800
|
+
note: "The open stream goes on: the grace period is eternal at the defaults",
|
|
12801
|
+
source: "app.go:136-142, :862-876"
|
|
12802
|
+
},
|
|
12803
|
+
{
|
|
12804
|
+
id: "cd.drained",
|
|
12805
|
+
from: "draining",
|
|
12806
|
+
to: "closing",
|
|
12807
|
+
on: "upstream.end",
|
|
12808
|
+
timer: "goaway",
|
|
12809
|
+
source: "xs:1274-1281"
|
|
12810
|
+
},
|
|
12811
|
+
{
|
|
12812
|
+
id: "cd.client-end",
|
|
12813
|
+
from: [
|
|
12814
|
+
"idle",
|
|
12815
|
+
"active",
|
|
12816
|
+
"closing",
|
|
12817
|
+
"draining"
|
|
12818
|
+
],
|
|
12819
|
+
to: "ended",
|
|
12820
|
+
on: ["peer.fin", "peer.rst"],
|
|
12821
|
+
source: "xs"
|
|
12822
|
+
}
|
|
12823
|
+
],
|
|
12824
|
+
over: {
|
|
12825
|
+
machine: "systems.machine.linux-tcp",
|
|
12826
|
+
states: {
|
|
12827
|
+
idle: "ESTABLISHED",
|
|
12828
|
+
active: "ESTABLISHED",
|
|
12829
|
+
closing: "ESTABLISHED",
|
|
12830
|
+
draining: "ESTABLISHED"
|
|
12831
|
+
},
|
|
12832
|
+
sets: {
|
|
12833
|
+
keepidle: {
|
|
12834
|
+
knob: "keepidle",
|
|
12835
|
+
unit: "s"
|
|
12836
|
+
},
|
|
12837
|
+
keepintvl: {
|
|
12838
|
+
knob: "keepintvl",
|
|
12839
|
+
unit: "s"
|
|
12840
|
+
},
|
|
12841
|
+
keepcnt: {
|
|
12842
|
+
knob: "keepcnt",
|
|
12843
|
+
unit: "count"
|
|
12844
|
+
}
|
|
12845
|
+
},
|
|
12846
|
+
ends: "peer.rst",
|
|
12847
|
+
note: "The socket toward the client: a Linux TCP socket with the keepalive of Go. The socket toward the upstream has 15 s, 30 s and 9 probes"
|
|
12848
|
+
}
|
|
12849
|
+
});
|
|
12850
|
+
//#endregion
|
|
12274
12851
|
//#region src/proxy/envoy.ts
|
|
12275
12852
|
const AT$2 = "envoy v1.39.4";
|
|
12276
12853
|
/**
|
|
@@ -15131,6 +15708,7 @@ const MACHINES = byId([
|
|
|
15131
15708
|
NODE_HTTP_SERVER,
|
|
15132
15709
|
NODE_HTTP_AGENT,
|
|
15133
15710
|
UNDICI_CLIENT,
|
|
15711
|
+
UNDICI_RETRY,
|
|
15134
15712
|
GO_TRANSPORT,
|
|
15135
15713
|
PROCEDURES_WS_CLIENT,
|
|
15136
15714
|
PROCEDURES_WS_SERVER,
|
|
@@ -15154,9 +15732,10 @@ const MACHINES = byId([
|
|
|
15154
15732
|
ETCD_SERVER,
|
|
15155
15733
|
TOXIPROXY_LINK,
|
|
15156
15734
|
DOCKER_PROXY_LINK,
|
|
15157
|
-
ENVOY_HTTP2
|
|
15735
|
+
ENVOY_HTTP2,
|
|
15736
|
+
CADDY_HTTP2
|
|
15158
15737
|
]);
|
|
15159
15738
|
//#endregion
|
|
15160
|
-
export { AMQPLIB, ATEN_DETECTOR, DOCKER_PROXY_LINK, ENVOY_HTTP2, ETCD_SERVER, GO_TRANSPORT, GRPC_GO_SERVER, GRPC_JS, HIKARICP_PGJDBC, IOREDIS_SENTINEL, IOREDIS_STATUS, LINUX_TCP, MACHINES, MANIFESTATIONS, MONGODB_NODE, MONGOD_REPL, MONGOD_SESSION, NF_CONNTRACK_TCP, NODE_HTTP_AGENT, NODE_HTTP_SERVER, NODE_POSTGRES, NODE_TIMER_EARLY, PGBOUNCER_CLIENT, PGBOUNCER_SERVER, PGPOOL_SESSION, POSTGRES_SESSION, PROCEDURES_WS_CLIENT, PROCEDURES_WS_SERVER, RABBITMQ_CONNECTION, RA_MEMBER, REDIS_CLIENT, SENTINEL, SUPAVISOR_CLIENT, SUPAVISOR_SERVER, TOXIPROXY_LINK, UNDICI_CLIENT, UNDICI_TICK_MS, goLateSeconds, goTimerLateness, nodeEarlySeconds, nodeLateSeconds, nodeTimerLateness, undiciFastEarly, undiciFastLateness };
|
|
15739
|
+
export { AMQPLIB, ATEN_DETECTOR, CADDY_HTTP2, DOCKER_PROXY_LINK, ENVOY_HTTP2, ETCD_SERVER, GO_TRANSPORT, GRPC_GO_SERVER, GRPC_JS, HIKARICP_PGJDBC, IOREDIS_SENTINEL, IOREDIS_STATUS, LINUX_TCP, MACHINES, MANIFESTATIONS, MONGODB_NODE, MONGOD_REPL, MONGOD_SESSION, NF_CONNTRACK_TCP, NODE_HTTP_AGENT, NODE_HTTP_SERVER, NODE_POSTGRES, NODE_TIMER_EARLY, PGBOUNCER_CLIENT, PGBOUNCER_SERVER, PGPOOL_SESSION, POSTGRES_SESSION, PROCEDURES_WS_CLIENT, PROCEDURES_WS_SERVER, RABBITMQ_CONNECTION, RA_MEMBER, REDIS_CLIENT, SENTINEL, SUPAVISOR_CLIENT, SUPAVISOR_SERVER, TOXIPROXY_LINK, UNDICI_CLIENT, UNDICI_RETRY, UNDICI_TICK_MS, goLateSeconds, goTimerLateness, nodeEarlySeconds, nodeLateSeconds, nodeTimerLateness, undiciFastEarly, undiciFastLateness };
|
|
15161
15740
|
|
|
15162
15741
|
//# sourceMappingURL=index.js.map
|