@zlink-systems/framework 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +24 -18
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +158 -124
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +116 -113
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +10 -18
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +43 -33
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -7
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +47 -39
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -23
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +136 -136
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.js +416 -438
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.js +96 -95
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +244 -227
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +208 -219
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +23 -20
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +74 -85
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +16 -14
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +5 -5
- package/dist/runtime/spots/spot-timer.js +25 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +98 -107
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +18 -16
- package/dist/runtime/streams/bound-session-service.js +8 -9
- package/dist/runtime/streams/index.js +20 -19
- package/dist/runtime/streams/managed-stream.js +32 -30
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.js +29 -18
- package/dist/runtime/streams/session-actor-coordinator.js +34 -37
- package/dist/runtime/streams/session-context.js +30 -28
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.js +11 -5
- package/dist/runtime/streams/stream-session-runtime.js +70 -66
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +2 -2
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +0 -1
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +138 -130
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +5 -4
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +351 -320
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +73 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +335 -383
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +40 -42
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +215 -197
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +11 -8
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/flow-context.ts +12 -3
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +95 -76
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -51
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +312 -385
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +1 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1174 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +157 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +593 -563
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +184 -153
- package/src/runtime/spots/spot-actor-packet-drain.ts +54 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +230 -221
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +128 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +11 -17
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +56 -46
- package/src/runtime/spots/spot-timer.ts +98 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +277 -235
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +7 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +53 -51
- package/src/runtime/streams/bound-session-response-target.ts +29 -8
- package/src/runtime/streams/bound-session-service.ts +39 -39
- package/src/runtime/streams/index.ts +176 -100
- package/src/runtime/streams/managed-stream.ts +98 -87
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +73 -43
- package/src/runtime/streams/session-actor-coordinator.ts +97 -89
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +66 -48
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +55 -38
- package/src/runtime/streams/stream-session-runtime.ts +268 -210
- package/src/runtime/workers/index.ts +68 -29
|
@@ -8,8 +8,8 @@ function opaqueRecordPreimage(record, ...segments) {
|
|
|
8
8
|
return [record, ...segments].join('\0');
|
|
9
9
|
}
|
|
10
10
|
function creationTerminalPreimage(operation) {
|
|
11
|
-
return opaqueRecordPreimage('creation-terminal', routingIdHexSegment(operation.sourceNodeRid), operation.sourceNodeGeneration.toString(), operation.operationId.high.toString(16).padStart(16, '0')
|
|
12
|
-
|
|
11
|
+
return opaqueRecordPreimage('creation-terminal', routingIdHexSegment(operation.sourceNodeRid), operation.sourceNodeGeneration.toString(), operation.operationId.high.toString(16).padStart(16, '0') +
|
|
12
|
+
operation.operationId.low.toString(16).padStart(16, '0'));
|
|
13
13
|
}
|
|
14
14
|
function routingIdHexSegment(routingId) {
|
|
15
15
|
return (0, routing_id_1.encodeRoutingIdStorageHex)(routingId).toLowerCase();
|
|
@@ -23,15 +23,15 @@ const diagnostics_1 = require("../diagnostics");
|
|
|
23
23
|
function projectCanonicalActorRoute(snapshot, actorId) {
|
|
24
24
|
const { allocation } = snapshot;
|
|
25
25
|
const nodeRid = allocation.descriptor.rid;
|
|
26
|
-
if (allocation.objectKind !== 'actor'
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
if (allocation.objectKind !== 'actor' ||
|
|
27
|
+
allocation.state !== 'active' ||
|
|
28
|
+
snapshot.objectGeneration <= 0n ||
|
|
29
|
+
snapshot.ownerLeaseGeneration <= 0n ||
|
|
30
|
+
actorId.length === 0 ||
|
|
31
|
+
allocation.stableType.length === 0 ||
|
|
32
|
+
allocation.descriptor.meshName.length === 0 ||
|
|
33
|
+
String(nodeRid).length === 0 ||
|
|
34
|
+
allocation.descriptorLifecycleGeneration <= 0n)
|
|
35
35
|
return undefined;
|
|
36
36
|
return {
|
|
37
37
|
meshName: allocation.descriptor.meshName,
|
|
@@ -67,17 +67,18 @@ class ZLinkStoreLocationResolvers {
|
|
|
67
67
|
}
|
|
68
68
|
async listLivePeers(filter, signal) {
|
|
69
69
|
const rows = await this.options.stores.peerStore.listPeers(filter, signal);
|
|
70
|
-
return await this.liveRows.filter(rows, (row) => row.ownerId, signal, (row) => (0, canonical_codec_1.isKnownZLinkLocationAutoConnectType)(row.autoConnectType) &&
|
|
70
|
+
return await this.liveRows.filter(rows, (row) => row.ownerId, signal, (row) => (0, canonical_codec_1.isKnownZLinkLocationAutoConnectType)(row.autoConnectType) &&
|
|
71
|
+
(0, canonical_codec_1.isKnownZLinkLocationRole)(row.role));
|
|
71
72
|
}
|
|
72
73
|
async resolveEntrySpotNode(spotId, meshNames, signal) {
|
|
73
74
|
for (const meshName of meshNames) {
|
|
74
75
|
const descriptors = await this.liveRows.filter((await this.options.stores.locationStore.listMeshNodes(meshName, undefined, signal)).items, (descriptor) => descriptor.ownerId, signal);
|
|
75
|
-
const descriptor = descriptors.find((candidate) => candidate.entrySpotId === spotId
|
|
76
|
-
|
|
76
|
+
const descriptor = descriptors.find((candidate) => candidate.entrySpotId === spotId &&
|
|
77
|
+
candidate.objectRole === internal_location_contracts_1.ZLinkObjectRole.Server &&
|
|
77
78
|
// An Entry Spot accepts new joins only while its owning node is Serving.
|
|
78
79
|
// Preparing/retiring/error rows may still be visible during replacement,
|
|
79
80
|
// but routing them would turn a valid transfer into NotConnected.
|
|
80
|
-
|
|
81
|
+
candidate.state === internal_location_contracts_1.ZLinkFrameworkRuntimeState.Serving);
|
|
81
82
|
if (descriptor !== undefined) {
|
|
82
83
|
return {
|
|
83
84
|
meshName,
|
|
@@ -96,13 +97,13 @@ class ZLinkStoreLocationResolvers {
|
|
|
96
97
|
const liveDescriptors = await this.liveRows.filter(descriptors, (descriptor) => descriptor.ownerId, signal);
|
|
97
98
|
const candidates = liveDescriptors.filter((descriptor) => {
|
|
98
99
|
const capacity = descriptor.populationCapacity.actors;
|
|
99
|
-
return descriptor.state === internal_location_contracts_1.ZLinkFrameworkRuntimeState.Serving
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
100
|
+
return (descriptor.state === internal_location_contracts_1.ZLinkFrameworkRuntimeState.Serving &&
|
|
101
|
+
descriptor.objectRole === internal_location_contracts_1.ZLinkObjectRole.Server &&
|
|
102
|
+
descriptor.placementWeight > 0 &&
|
|
103
|
+
!(0, routing_id_1.routingIdsEqual)(descriptor.rid, excludedNodeRid) &&
|
|
104
|
+
!excludedCandidateRids.has(String(descriptor.rid)) &&
|
|
105
|
+
capacity.active + capacity.reserved < capacity.limit &&
|
|
106
|
+
descriptor.objectCapabilities.some((candidate) => candidate.objectKind === 'actor' && candidate.stableType === actorType));
|
|
106
107
|
});
|
|
107
108
|
if (candidates.length === 0)
|
|
108
109
|
return undefined;
|
|
@@ -162,9 +163,7 @@ class ZLinkStoreLocationResolvers {
|
|
|
162
163
|
if (row === undefined) {
|
|
163
164
|
return undefined;
|
|
164
165
|
}
|
|
165
|
-
const spotId = row.spotKind === Spots_1.ZLinkSpotKind.Entry
|
|
166
|
-
? row.ownerNodeRid
|
|
167
|
-
: row.spotId;
|
|
166
|
+
const spotId = row.spotKind === Spots_1.ZLinkSpotKind.Entry ? row.ownerNodeRid : row.spotId;
|
|
168
167
|
return {
|
|
169
168
|
meshName: row.meshName,
|
|
170
169
|
nodeRid: String(row.ownerNodeRid),
|
|
@@ -221,13 +220,11 @@ class ZLinkStoreLocationResolvers {
|
|
|
221
220
|
});
|
|
222
221
|
return unavailable;
|
|
223
222
|
}
|
|
224
|
-
if (decoded === undefined
|
|
225
|
-
|
|
226
|
-
|
|
223
|
+
if (decoded === undefined ||
|
|
224
|
+
decoded.actor.actorId !== actorId ||
|
|
225
|
+
decoded.actor.objectGeneration !== current.objectGeneration) {
|
|
227
226
|
const route = await this.cacheDirectActorRoute(actorId, projectCanonicalActorRoute(current, actorId), remainingLeaseMs);
|
|
228
|
-
return route === undefined
|
|
229
|
-
? { kind: 'missing' }
|
|
230
|
-
: { kind: 'ready', route };
|
|
227
|
+
return route === undefined ? { kind: 'missing' } : { kind: 'ready', route };
|
|
231
228
|
}
|
|
232
229
|
let enclosingSpotRoute;
|
|
233
230
|
if (decoded.spotKind === Spots_1.ZLinkSpotKind.User) {
|
|
@@ -235,8 +232,8 @@ class ZLinkStoreLocationResolvers {
|
|
|
235
232
|
enclosingSpotRoute = await this.authoritySpotResolver.resolve(decoded.spotId, signal);
|
|
236
233
|
}
|
|
237
234
|
catch (error) {
|
|
238
|
-
if (error instanceof Errors_1.ZLinkFrameworkException
|
|
239
|
-
|
|
235
|
+
if (error instanceof Errors_1.ZLinkFrameworkException &&
|
|
236
|
+
(0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotRouteNotFound) {
|
|
240
237
|
return { kind: 'missing' };
|
|
241
238
|
}
|
|
242
239
|
throw error;
|
|
@@ -261,9 +258,7 @@ class ZLinkStoreLocationResolvers {
|
|
|
261
258
|
enclosingSpotRoute
|
|
262
259
|
};
|
|
263
260
|
const cachedRoute = await this.cacheDirectActorRoute(actorId, route, remainingLeaseMs);
|
|
264
|
-
return cachedRoute === undefined
|
|
265
|
-
? { kind: 'missing' }
|
|
266
|
-
: { kind: 'ready', route: cachedRoute };
|
|
261
|
+
return cachedRoute === undefined ? { kind: 'missing' } : { kind: 'ready', route: cachedRoute };
|
|
267
262
|
}
|
|
268
263
|
async cacheDirectActorRoute(actorId, route, remainingLeaseMs) {
|
|
269
264
|
return await this.lane.run(() => {
|
|
@@ -302,7 +297,7 @@ class ZLinkStoreLocationResolvers {
|
|
|
302
297
|
this.options.events?.spotResolveMiss(key);
|
|
303
298
|
return undefined;
|
|
304
299
|
}
|
|
305
|
-
if (!await this.cacheReady(this.spotRoutes, cacheKey, row, row.ownerId, row.leaseGeneration, signal)) {
|
|
300
|
+
if (!(await this.cacheReady(this.spotRoutes, cacheKey, row, row.ownerId, row.leaseGeneration, signal))) {
|
|
306
301
|
this.options.events?.spotResolveMiss(key);
|
|
307
302
|
return undefined;
|
|
308
303
|
}
|
|
@@ -318,9 +313,9 @@ class ZLinkStoreLocationResolvers {
|
|
|
318
313
|
return undefined;
|
|
319
314
|
}
|
|
320
315
|
async resolveMeshNodeState(meshName, nodeRid, expectedLifecycleGeneration, signal) {
|
|
321
|
-
const descriptor = (await this.options.stores.locationStore.listMeshNodes(meshName, undefined, signal)).items.find((candidate) => (0, routing_id_1.routingIdsEqual)(candidate.rid, nodeRid)
|
|
322
|
-
|
|
323
|
-
|
|
316
|
+
const descriptor = (await this.options.stores.locationStore.listMeshNodes(meshName, undefined, signal)).items.find((candidate) => (0, routing_id_1.routingIdsEqual)(candidate.rid, nodeRid) &&
|
|
317
|
+
(expectedLifecycleGeneration === undefined ||
|
|
318
|
+
candidate.lifecycleGeneration === expectedLifecycleGeneration));
|
|
324
319
|
return descriptor?.state;
|
|
325
320
|
}
|
|
326
321
|
async resolveActorRow(key, signal) {
|
|
@@ -328,9 +323,7 @@ class ZLinkStoreLocationResolvers {
|
|
|
328
323
|
const cached = await this.lane.run(() => this.getCachedCore(this.actorRoutes, cacheKey));
|
|
329
324
|
if (cached !== undefined)
|
|
330
325
|
return cached;
|
|
331
|
-
const meshNames = key.meshName.length === 0
|
|
332
|
-
? this.options.spotMeshNames ?? []
|
|
333
|
-
: [key.meshName];
|
|
326
|
+
const meshNames = key.meshName.length === 0 ? (this.options.spotMeshNames ?? []) : [key.meshName];
|
|
334
327
|
let stored;
|
|
335
328
|
for (const meshName of meshNames) {
|
|
336
329
|
stored = await this.options.stores.actorStore.resolveActor({
|
|
@@ -340,14 +333,14 @@ class ZLinkStoreLocationResolvers {
|
|
|
340
333
|
if (stored !== undefined)
|
|
341
334
|
break;
|
|
342
335
|
}
|
|
343
|
-
const row = await this.liveRows.resolve(stored, (candidate) => candidate.ownerId, signal, (candidate) => candidate.actorRef.objectGeneration > 0n
|
|
344
|
-
|
|
345
|
-
|
|
336
|
+
const row = await this.liveRows.resolve(stored, (candidate) => candidate.ownerId, signal, (candidate) => candidate.actorRef.objectGeneration > 0n &&
|
|
337
|
+
candidate.ownerNodeGeneration > 0n &&
|
|
338
|
+
candidate.membershipEpoch > 0n);
|
|
346
339
|
if (row === undefined) {
|
|
347
340
|
this.options.events?.actorResolveMiss(key);
|
|
348
341
|
return undefined;
|
|
349
342
|
}
|
|
350
|
-
if (!await this.cacheReady(this.actorRoutes, cacheKey, row, row.ownerId, row.leaseGeneration, signal)) {
|
|
343
|
+
if (!(await this.cacheReady(this.actorRoutes, cacheKey, row, row.ownerId, row.leaseGeneration, signal))) {
|
|
351
344
|
this.options.events?.actorResolveMiss(key);
|
|
352
345
|
return undefined;
|
|
353
346
|
}
|
|
@@ -390,8 +383,8 @@ class ZLinkStoreLocationResolvers {
|
|
|
390
383
|
}
|
|
391
384
|
}
|
|
392
385
|
for (const [key, cached] of this.actorRoutes) {
|
|
393
|
-
if (cached.row.spotId === spotId
|
|
394
|
-
|
|
386
|
+
if (cached.row.spotId === spotId &&
|
|
387
|
+
(meshName === undefined || cached.row.meshName === meshName))
|
|
395
388
|
this.actorRoutes.delete(key);
|
|
396
389
|
}
|
|
397
390
|
}
|
|
@@ -450,43 +443,43 @@ class ZLinkStoreLocationResolvers {
|
|
|
450
443
|
}
|
|
451
444
|
exports.ZLinkStoreLocationResolvers = ZLinkStoreLocationResolvers;
|
|
452
445
|
function directActorRouteMatchesFence(route, fence) {
|
|
453
|
-
return route.actorRef.actorId === fence.actorId
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
446
|
+
return (route.actorRef.actorId === fence.actorId &&
|
|
447
|
+
route.actorRef.objectGeneration === fence.objectGeneration &&
|
|
448
|
+
(0, routing_id_1.routingIdsEqual)(route.actorRef.nodeRid, fence.targetNodeRid) &&
|
|
449
|
+
route.ownerNodeGeneration === fence.targetNodeGeneration &&
|
|
450
|
+
route.authorityOwnerGeneration === fence.authorityOwnerGeneration &&
|
|
451
|
+
route.ownerLeaseGeneration === fence.ownerLeaseGeneration);
|
|
459
452
|
}
|
|
460
453
|
function legacyActorRouteMatchesFence(route, fence) {
|
|
461
|
-
return route.actorId === fence.actorId
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
454
|
+
return (route.actorId === fence.actorId &&
|
|
455
|
+
route.actorRef.objectGeneration === fence.objectGeneration &&
|
|
456
|
+
(0, routing_id_1.routingIdsEqual)(route.actorRef.nodeRid, fence.targetNodeRid) &&
|
|
457
|
+
route.ownerNodeGeneration === fence.targetNodeGeneration &&
|
|
458
|
+
route.leaseGeneration === fence.ownerLeaseGeneration);
|
|
466
459
|
}
|
|
467
460
|
function spotRouteMatchesFence(route, fence) {
|
|
468
|
-
return route.spotId === fence.spotId
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
461
|
+
return (route.spotId === fence.spotId &&
|
|
462
|
+
route.spotGeneration === fence.objectGeneration &&
|
|
463
|
+
(0, routing_id_1.routingIdsEqual)(route.ownerNodeRid, fence.targetNodeRid) &&
|
|
464
|
+
route.ownerNodeGeneration === fence.targetNodeGeneration &&
|
|
465
|
+
route.leaseGeneration === fence.ownerLeaseGeneration);
|
|
473
466
|
}
|
|
474
467
|
function actorEnclosingSpotMatchesFence(route, fence) {
|
|
475
|
-
return route.spotId === fence.spotId
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
468
|
+
return (route.spotId === fence.spotId &&
|
|
469
|
+
route.spotGeneration === fence.objectGeneration &&
|
|
470
|
+
(0, routing_id_1.routingIdsEqual)(route.ownerNodeRid, fence.targetNodeRid) &&
|
|
471
|
+
route.ownerNodeGeneration === fence.targetNodeGeneration &&
|
|
472
|
+
route.leaseGeneration === fence.ownerLeaseGeneration);
|
|
480
473
|
}
|
|
481
474
|
function resolvedActorEnclosingSpotMatchesFence(route, fence) {
|
|
482
475
|
const enclosing = route.enclosingSpotRoute;
|
|
483
|
-
return enclosing !== undefined
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
476
|
+
return (enclosing !== undefined &&
|
|
477
|
+
enclosing.spotId === fence.spotId &&
|
|
478
|
+
enclosing.targetSpotGeneration === fence.objectGeneration &&
|
|
479
|
+
(0, routing_id_1.routingIdsEqual)(enclosing.targetNodeRid, fence.targetNodeRid) &&
|
|
480
|
+
enclosing.targetNodeGeneration === fence.targetNodeGeneration &&
|
|
481
|
+
enclosing.authorityOwnerGeneration === fence.authorityOwnerGeneration &&
|
|
482
|
+
enclosing.ownerLeaseGeneration === fence.ownerLeaseGeneration);
|
|
490
483
|
}
|
|
491
484
|
class DefaultZLinkLocationReadiness {
|
|
492
485
|
query;
|
|
@@ -590,10 +583,10 @@ class ZLinkAuthoritySpotRouteResolver {
|
|
|
590
583
|
const current = await this.store.readAuthority((0, authority_key_codec_1.encodeAuthorityKey)('user_spot', key), signal);
|
|
591
584
|
if (current.kind === 'snapshot' && current.allocation.state === 'active') {
|
|
592
585
|
const decoded = (0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)((0, service_relocation_runtime_1.serviceRelocationAuthorityApplicationPayload)(current.payload));
|
|
593
|
-
if (decoded !== undefined
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
586
|
+
if (decoded !== undefined &&
|
|
587
|
+
decoded.spotId === String(spotId) &&
|
|
588
|
+
decoded.ownerId === current.ownerId &&
|
|
589
|
+
decoded.ownerLeaseGeneration === current.ownerLeaseGeneration) {
|
|
597
590
|
const remainingLeaseMs = this.leaseTracker === undefined
|
|
598
591
|
? undefined
|
|
599
592
|
: await this.leaseTracker.remainingOwnerTokenLeaseMs({
|
|
@@ -607,9 +600,7 @@ class ZLinkAuthoritySpotRouteResolver {
|
|
|
607
600
|
routerChannelId: this.routerChannelIdForMesh(decoded.ownerMeshName),
|
|
608
601
|
targetNodeRid: decoded.ownerNodeRid,
|
|
609
602
|
spotId,
|
|
610
|
-
spotKind: decoded.kind === 'instance_spot'
|
|
611
|
-
? Spots_1.ZLinkSpotKind.Instance
|
|
612
|
-
: Spots_1.ZLinkSpotKind.User,
|
|
603
|
+
spotKind: decoded.kind === 'instance_spot' ? Spots_1.ZLinkSpotKind.Instance : Spots_1.ZLinkSpotKind.User,
|
|
613
604
|
stableType: decoded.stableType,
|
|
614
605
|
targetSpotGeneration: current.objectGeneration,
|
|
615
606
|
targetNodeGeneration: current.allocation.descriptorLifecycleGeneration,
|
|
@@ -55,9 +55,9 @@ class ZLinkLocationRuntime {
|
|
|
55
55
|
ownerLeaseRenewedAt;
|
|
56
56
|
lastError;
|
|
57
57
|
get ownerLeaseUsable() {
|
|
58
|
-
return this.ownerToken !== undefined
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
return (this.ownerToken !== undefined &&
|
|
59
|
+
this.ownerLeaseDeadlineMs !== undefined &&
|
|
60
|
+
this.monotonicNowMs() < this.ownerLeaseDeadlineMs);
|
|
61
61
|
}
|
|
62
62
|
constructor(runtimeOptions) {
|
|
63
63
|
this.stores = runtimeOptions.stores;
|
|
@@ -66,16 +66,20 @@ class ZLinkLocationRuntime {
|
|
|
66
66
|
this.events = runtimeOptions.events;
|
|
67
67
|
this.metrics = runtimeOptions.metrics;
|
|
68
68
|
this.meshNames = [...new Set(runtimeOptions.meshNames ?? [])];
|
|
69
|
-
this.leaseScopes =
|
|
69
|
+
this.leaseScopes =
|
|
70
|
+
runtimeOptions.leaseScopes ?? this.meshNames.map((name) => ({ kind: 'mesh', name }));
|
|
70
71
|
this.rewriteAuthorityPayloadForOwner = runtimeOptions.rewriteAuthorityPayloadForOwner;
|
|
71
72
|
this.monotonicNowMs = runtimeOptions.monotonicNowMs ?? (() => performance.now());
|
|
72
|
-
this.setTimer =
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
this.setTimer =
|
|
74
|
+
runtimeOptions.setTimer ?? ((callback, delayMs) => setTimeout(callback, delayMs));
|
|
75
|
+
this.clearTimer =
|
|
76
|
+
runtimeOptions.clearTimer ?? ((handle) => clearTimeout(handle));
|
|
77
|
+
const leaseTracker = runtimeOptions.leaseTracker ??
|
|
78
|
+
new lease_tracker_1.ZLinkOwnerLeaseTracker({
|
|
79
|
+
store: this.stores.ownerLeaseStore,
|
|
80
|
+
options: this.options,
|
|
81
|
+
monotonicNowMs: this.monotonicNowMs
|
|
82
|
+
});
|
|
79
83
|
this.liveRows = new lease_tracker_1.ZLinkLiveRowFilter(leaseTracker);
|
|
80
84
|
}
|
|
81
85
|
get isStarted() {
|
|
@@ -100,8 +104,8 @@ class ZLinkLocationRuntime {
|
|
|
100
104
|
const failures = [];
|
|
101
105
|
for (const entry of entries) {
|
|
102
106
|
const snapshot = entry.snapshot;
|
|
103
|
-
if (snapshot.ownerId !== owner.ownerId
|
|
104
|
-
|
|
107
|
+
if (snapshot.ownerId !== owner.ownerId ||
|
|
108
|
+
snapshot.ownerLeaseGeneration === owner.leaseGeneration) {
|
|
105
109
|
continue;
|
|
106
110
|
}
|
|
107
111
|
try {
|
|
@@ -112,16 +116,15 @@ class ZLinkLocationRuntime {
|
|
|
112
116
|
leaseGeneration: snapshot.ownerLeaseGeneration
|
|
113
117
|
},
|
|
114
118
|
targetOwner: owner,
|
|
115
|
-
payload: Buffer.from(this.rewriteAuthorityPayloadForOwner?.(snapshot.payload, owner)
|
|
116
|
-
?? snapshot.payload)
|
|
119
|
+
payload: Buffer.from(this.rewriteAuthorityPayloadForOwner?.(snapshot.payload, owner) ?? snapshot.payload)
|
|
117
120
|
}, signal);
|
|
118
121
|
if (result.kind === 'stored')
|
|
119
122
|
continue;
|
|
120
123
|
if (result.kind === 'conflict') {
|
|
121
124
|
const current = result.current;
|
|
122
|
-
if (current.kind === 'snapshot'
|
|
123
|
-
|
|
124
|
-
|
|
125
|
+
if (current.kind === 'snapshot' &&
|
|
126
|
+
current.ownerId === owner.ownerId &&
|
|
127
|
+
current.ownerLeaseGeneration === owner.leaseGeneration) {
|
|
125
128
|
continue;
|
|
126
129
|
}
|
|
127
130
|
continue;
|
|
@@ -213,7 +216,8 @@ class ZLinkLocationRuntime {
|
|
|
213
216
|
return;
|
|
214
217
|
}
|
|
215
218
|
try {
|
|
216
|
-
const owner = this.ownerToken ??
|
|
219
|
+
const owner = this.ownerToken ??
|
|
220
|
+
this.lastOwnerToken ?? {
|
|
217
221
|
ownerId: this.ownerId,
|
|
218
222
|
leaseGeneration: 0n
|
|
219
223
|
};
|
|
@@ -306,7 +310,7 @@ class ZLinkLocationRuntime {
|
|
|
306
310
|
// stop() may have completed while the Store claim was in flight. Do
|
|
307
311
|
// not install a token into a stopped runtime or leave an orphan lease.
|
|
308
312
|
try {
|
|
309
|
-
await withTimeout(releaseSignal => this.stores.ownerLeaseStore.releaseOwnerLease(claim.token, releaseSignal), remainingTimeoutMs(timeoutDeadline));
|
|
313
|
+
await withTimeout((releaseSignal) => this.stores.ownerLeaseStore.releaseOwnerLease(claim.token, releaseSignal), remainingTimeoutMs(timeoutDeadline));
|
|
310
314
|
}
|
|
311
315
|
catch (error) {
|
|
312
316
|
this.recordFailure(errorMessage(error), 'owner_lease_release');
|
|
@@ -353,7 +357,7 @@ class ZLinkLocationRuntime {
|
|
|
353
357
|
if (claim.kind !== 'conflict')
|
|
354
358
|
return claim;
|
|
355
359
|
const conflict = new ZLinkOwnerLeaseClaimError(claim.kind);
|
|
356
|
-
return await this.confirmOwnerLease(conflict, timeoutDeadline, signal) ?? claim;
|
|
360
|
+
return (await this.confirmOwnerLease(conflict, timeoutDeadline, signal)) ?? claim;
|
|
357
361
|
}
|
|
358
362
|
async confirmOwnerLease(originalError, timeoutDeadline, signal) {
|
|
359
363
|
const confirmationTimeoutMs = remainingTimeoutMs(timeoutDeadline);
|
|
@@ -361,7 +365,7 @@ class ZLinkLocationRuntime {
|
|
|
361
365
|
throw originalError;
|
|
362
366
|
let confirmed;
|
|
363
367
|
try {
|
|
364
|
-
confirmed = await withTimeout(readSignal => this.stores.ownerLeaseStore.readOwnerLease(this.ownerId, readSignal), confirmationTimeoutMs);
|
|
368
|
+
confirmed = await withTimeout((readSignal) => this.stores.ownerLeaseStore.readOwnerLease(this.ownerId, readSignal), confirmationTimeoutMs);
|
|
365
369
|
}
|
|
366
370
|
catch (confirmationError) {
|
|
367
371
|
this.recordFailure(errorMessage(confirmationError), 'owner_lease_claim_confirmation');
|
|
@@ -372,7 +376,7 @@ class ZLinkLocationRuntime {
|
|
|
372
376
|
}
|
|
373
377
|
if (signal?.aborted === true) {
|
|
374
378
|
try {
|
|
375
|
-
await withTimeout(releaseSignal => this.stores.ownerLeaseStore.releaseOwnerLease(confirmed.token, releaseSignal), remainingTimeoutMs(timeoutDeadline));
|
|
379
|
+
await withTimeout((releaseSignal) => this.stores.ownerLeaseStore.releaseOwnerLease(confirmed.token, releaseSignal), remainingTimeoutMs(timeoutDeadline));
|
|
376
380
|
}
|
|
377
381
|
catch (releaseError) {
|
|
378
382
|
this.recordFailure(errorMessage(releaseError), 'owner_lease_release');
|
|
@@ -392,7 +396,9 @@ class ZLinkLocationRuntime {
|
|
|
392
396
|
// The Store's remaining TTL is measured at an unknown point during the
|
|
393
397
|
// request. Subtract the full observed round trip and the fencing margin
|
|
394
398
|
// so local eligibility cannot outlive the conservative pre-request bound.
|
|
395
|
-
this.ownerLeaseDeadlineMs =
|
|
399
|
+
this.ownerLeaseDeadlineMs =
|
|
400
|
+
requestCompletedAtMs +
|
|
401
|
+
Math.max(0, remainingTtlMs - roundTripMs - this.options.ownerLeaseFencingMarginMs);
|
|
396
402
|
}
|
|
397
403
|
async publishDraining(signal) {
|
|
398
404
|
try {
|
|
@@ -427,9 +433,9 @@ class ZLinkLocationRuntime {
|
|
|
427
433
|
updatedAt: new Date()
|
|
428
434
|
};
|
|
429
435
|
let result = await this.guardWrite(() => this.stores.locationStore.updateMeshNode(stamped, intent, signal));
|
|
430
|
-
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.Renew
|
|
431
|
-
|
|
432
|
-
|
|
436
|
+
if (intent === internal_location_contracts_1.ZLinkLocationWriteIntent.Renew &&
|
|
437
|
+
(result.status === internal_location_contracts_1.ZLinkLocationWriteStatus.RejectedConflict ||
|
|
438
|
+
result.status === internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale)) {
|
|
433
439
|
// A Store restart can remove the descriptor while retaining the
|
|
434
440
|
// in-process owner token. Renew cannot recreate an absent row, so use
|
|
435
441
|
// NewClaim as a bounded fallback. If another owner has recreated the
|
|
@@ -499,7 +505,11 @@ class ZLinkLocationRuntime {
|
|
|
499
505
|
const result = await this.guardWrite(() => this.stores.routeStore.updateRoute(stamped, intent, signal));
|
|
500
506
|
const key = { routeKind: route.routeKind, routeKey: route.routeKey };
|
|
501
507
|
if (result.status === internal_location_contracts_1.ZLinkLocationWriteStatus.Stored) {
|
|
502
|
-
this.events?.routeRowUpdated(key, {
|
|
508
|
+
this.events?.routeRowUpdated(key, {
|
|
509
|
+
...stamped,
|
|
510
|
+
generation: result.generation,
|
|
511
|
+
updatedAt: result.updatedAt
|
|
512
|
+
});
|
|
503
513
|
}
|
|
504
514
|
this.notifyIfStale(result, internal_location_contracts_1.ZLinkLocationKind.Route, key_codec_1.ZLinkLocationKeyCodec.encodeRouteKey(key));
|
|
505
515
|
return result;
|
|
@@ -598,9 +608,7 @@ class ZLinkLocationRuntime {
|
|
|
598
608
|
const normalizedPage = this.pageRequest(page);
|
|
599
609
|
const pageSize = normalizedPage.pageSize ?? this.options.listPageSize;
|
|
600
610
|
const requestedCursor = normalizedPage.continuationToken;
|
|
601
|
-
let cursor = requestedCursor === undefined
|
|
602
|
-
? undefined
|
|
603
|
-
: Authority_1.ZLinkAuthorityScanCursor.from(requestedCursor);
|
|
611
|
+
let cursor = requestedCursor === undefined ? undefined : Authority_1.ZLinkAuthorityScanCursor.from(requestedCursor);
|
|
604
612
|
const items = [];
|
|
605
613
|
for (;;) {
|
|
606
614
|
// Keep the Store cursor at the public page boundary. Scanning 1000 rows
|
|
@@ -612,11 +620,11 @@ class ZLinkLocationRuntime {
|
|
|
612
620
|
for (const entry of result.items) {
|
|
613
621
|
const identity = (0, authority_key_codec_1.decodeAuthorityKey)(entry.key);
|
|
614
622
|
const allocation = entry.snapshot.allocation;
|
|
615
|
-
if (allocation.objectKind !== filter.objectKind
|
|
616
|
-
|
|
617
|
-
|
|
623
|
+
if (allocation.objectKind !== filter.objectKind ||
|
|
624
|
+
(filter.stableType !== undefined && allocation.stableType !== filter.stableType) ||
|
|
625
|
+
(filter.meshName !== undefined && allocation.descriptor.meshName !== filter.meshName))
|
|
618
626
|
continue;
|
|
619
|
-
const live = await this.liveRows.resolve(entry, (candidate) => candidate.snapshot.ownerId, signal) !== undefined;
|
|
627
|
+
const live = (await this.liveRows.resolve(entry, (candidate) => candidate.snapshot.ownerId, signal)) !== undefined;
|
|
620
628
|
items.push(this.objectLocationEntry(identity.globalId, entry.snapshot, live));
|
|
621
629
|
if (items.length >= pageSize)
|
|
622
630
|
break;
|
|
@@ -638,16 +646,14 @@ class ZLinkLocationRuntime {
|
|
|
638
646
|
const found = await this.stores.authorityStore.readAuthority((0, authority_key_codec_1.encodeAuthorityKey)('user_spot', String(spotId)), signal);
|
|
639
647
|
if (found.kind === 'missing' || found.allocation.objectKind === 'actor')
|
|
640
648
|
return undefined;
|
|
641
|
-
const live = await this.liveRows.resolve(found, (snapshot) => snapshot.ownerId, signal)
|
|
642
|
-
!== undefined;
|
|
649
|
+
const live = (await this.liveRows.resolve(found, (snapshot) => snapshot.ownerId, signal)) !== undefined;
|
|
643
650
|
return this.objectLocationEntry(String(spotId), found, live);
|
|
644
651
|
}
|
|
645
652
|
async findObjectLocation(kind, globalId, signal) {
|
|
646
653
|
const found = await this.stores.authorityStore.readAuthority((0, authority_key_codec_1.encodeAuthorityKey)(kind, globalId), signal);
|
|
647
654
|
if (found.kind === 'missing' || found.allocation.objectKind !== kind)
|
|
648
655
|
return undefined;
|
|
649
|
-
const live = await this.liveRows.resolve(found, (snapshot) => snapshot.ownerId, signal)
|
|
650
|
-
!== undefined;
|
|
656
|
+
const live = (await this.liveRows.resolve(found, (snapshot) => snapshot.ownerId, signal)) !== undefined;
|
|
651
657
|
return this.objectLocationEntry(globalId, found, live);
|
|
652
658
|
}
|
|
653
659
|
objectLocationEntry(globalId, snapshot, ownerLive) {
|
|
@@ -657,9 +663,7 @@ class ZLinkLocationRuntime {
|
|
|
657
663
|
objectGeneration: snapshot.objectGeneration,
|
|
658
664
|
meshName: allocation.descriptor.meshName,
|
|
659
665
|
nodeRid: allocation.descriptor.rid,
|
|
660
|
-
state: allocation.state === 'reserved'
|
|
661
|
-
? 'creating'
|
|
662
|
-
: ownerLive ? 'ready' : 'unavailable',
|
|
666
|
+
state: allocation.state === 'reserved' ? 'creating' : ownerLive ? 'ready' : 'unavailable',
|
|
663
667
|
stableType: allocation.stableType
|
|
664
668
|
};
|
|
665
669
|
}
|
|
@@ -674,7 +678,7 @@ class ZLinkLocationRuntime {
|
|
|
674
678
|
const entries = [];
|
|
675
679
|
for (const meshName of this.meshNamesOf(filter.meshName)) {
|
|
676
680
|
for (const descriptor of await this.listAllMeshNodeDescriptors(meshName, signal)) {
|
|
677
|
-
const live = (await this.filterLive([descriptor], row => row.ownerId, signal)).length > 0;
|
|
681
|
+
const live = (await this.filterLive([descriptor], (row) => row.ownerId, signal)).length > 0;
|
|
678
682
|
const entry = {
|
|
679
683
|
meshName: descriptor.meshName,
|
|
680
684
|
nodeRid: descriptor.rid,
|
|
@@ -683,14 +687,14 @@ class ZLinkLocationRuntime {
|
|
|
683
687
|
// 넘어간다고 정하고, §409는 draining node가 새 placement target이 되지
|
|
684
688
|
// 않는다고 정한다. Host lifecycle의 `Draining`만 보면 relocate로 빠지는
|
|
685
689
|
// node가 계속 accepting으로 보인다.
|
|
686
|
-
draining: descriptor.state === internal_location_contracts_1.ZLinkFrameworkRuntimeState.Draining
|
|
687
|
-
|
|
688
|
-
|
|
690
|
+
draining: descriptor.state === internal_location_contracts_1.ZLinkFrameworkRuntimeState.Draining ||
|
|
691
|
+
descriptor.state === internal_location_contracts_1.ZLinkFrameworkRuntimeState.Relocating ||
|
|
692
|
+
descriptor.state === internal_location_contracts_1.ZLinkFrameworkRuntimeState.Relocated,
|
|
689
693
|
state: live ? internal_location_contracts_1.ZLinkLocationTopologyState.Ready : internal_location_contracts_1.ZLinkLocationTopologyState.Lost,
|
|
690
694
|
updatedAt: descriptor.updatedAt
|
|
691
695
|
};
|
|
692
|
-
if ((filter.nodeRid === undefined || entry.nodeRid === filter.nodeRid)
|
|
693
|
-
|
|
696
|
+
if ((filter.nodeRid === undefined || entry.nodeRid === filter.nodeRid) &&
|
|
697
|
+
(filter.state === undefined || entry.state === filter.state)) {
|
|
694
698
|
entries.push(entry);
|
|
695
699
|
}
|
|
696
700
|
}
|
|
@@ -698,9 +702,7 @@ class ZLinkLocationRuntime {
|
|
|
698
702
|
return this.pageInMemory(entries, page);
|
|
699
703
|
}
|
|
700
704
|
pageRequest(page) {
|
|
701
|
-
return page?.pageSize === undefined
|
|
702
|
-
? { ...page, pageSize: this.options.listPageSize }
|
|
703
|
-
: page;
|
|
705
|
+
return page?.pageSize === undefined ? { ...page, pageSize: this.options.listPageSize } : page;
|
|
704
706
|
}
|
|
705
707
|
async listServiceSummaries(filter, page, signal) {
|
|
706
708
|
const summaries = [];
|
|
@@ -708,15 +710,15 @@ class ZLinkLocationRuntime {
|
|
|
708
710
|
const descriptors = await this.listAllMeshNodeDescriptors(meshName, signal);
|
|
709
711
|
if (descriptors.length === 0)
|
|
710
712
|
continue;
|
|
711
|
-
const live = await this.filterLive(descriptors, row => row.ownerId, signal);
|
|
712
|
-
const liveOwners = new Set(live.map(row => row.ownerId));
|
|
713
|
+
const live = await this.filterLive(descriptors, (row) => row.ownerId, signal);
|
|
714
|
+
const liveOwners = new Set(live.map((row) => row.ownerId));
|
|
713
715
|
summaries.push({
|
|
714
716
|
meshName,
|
|
715
717
|
totalCount: descriptors.length,
|
|
716
|
-
readyCount: descriptors.filter(row => liveOwners.has(row.ownerId)).length,
|
|
718
|
+
readyCount: descriptors.filter((row) => liveOwners.has(row.ownerId)).length,
|
|
717
719
|
errorCount: 0,
|
|
718
|
-
stoppedCount: descriptors.filter(row => !liveOwners.has(row.ownerId)).length,
|
|
719
|
-
lastUpdatedAt: descriptors.reduce((latest, row) => row.updatedAt > latest ? row.updatedAt : latest, descriptors[0].updatedAt)
|
|
720
|
+
stoppedCount: descriptors.filter((row) => !liveOwners.has(row.ownerId)).length,
|
|
721
|
+
lastUpdatedAt: descriptors.reduce((latest, row) => (row.updatedAt > latest ? row.updatedAt : latest), descriptors[0].updatedAt)
|
|
720
722
|
});
|
|
721
723
|
}
|
|
722
724
|
return this.pageInMemory(summaries, page);
|
|
@@ -753,8 +755,7 @@ class ZLinkLocationRuntime {
|
|
|
753
755
|
if (!this.started) {
|
|
754
756
|
return;
|
|
755
757
|
}
|
|
756
|
-
const scheduledAt = this.nextLeaseRenewAtMs
|
|
757
|
-
?? this.monotonicNowMs() + this.options.ownerLeaseRenewIntervalMs;
|
|
758
|
+
const scheduledAt = this.nextLeaseRenewAtMs ?? this.monotonicNowMs() + this.options.ownerLeaseRenewIntervalMs;
|
|
758
759
|
const delayMs = Math.max(0, scheduledAt - this.monotonicNowMs());
|
|
759
760
|
this.heartbeatTimer = this.setTimer(() => {
|
|
760
761
|
this.heartbeatTimer = undefined;
|
|
@@ -763,14 +764,16 @@ class ZLinkLocationRuntime {
|
|
|
763
764
|
this.metrics?.recordOwnerLeaseRenewLateness(lateness, scope.kind, scope.name);
|
|
764
765
|
}
|
|
765
766
|
this.nextLeaseRenewAtMs = scheduledAt + this.options.ownerLeaseRenewIntervalMs;
|
|
766
|
-
if (this.ownerLeaseDeadlineMs !== undefined
|
|
767
|
-
|
|
767
|
+
if (this.ownerLeaseDeadlineMs !== undefined &&
|
|
768
|
+
this.monotonicNowMs() >= this.ownerLeaseDeadlineMs) {
|
|
768
769
|
this.ownerLeaseHealthy = false;
|
|
769
770
|
this.recordFailure('Owner lease expired before renewal completed.', 'lease_expired');
|
|
770
771
|
for (const handler of this.ownerLeaseRenewalFailedHandlers)
|
|
771
772
|
handler();
|
|
772
773
|
}
|
|
773
|
-
const renewal = this.renewOwnerLeaseOnce()
|
|
774
|
+
const renewal = this.renewOwnerLeaseOnce()
|
|
775
|
+
.then(() => undefined, () => undefined)
|
|
776
|
+
.finally(() => {
|
|
774
777
|
if (this.heartbeatRenewal === renewal) {
|
|
775
778
|
this.heartbeatRenewal = undefined;
|
|
776
779
|
}
|
|
@@ -799,7 +802,8 @@ class ZLinkLocationRuntime {
|
|
|
799
802
|
}
|
|
800
803
|
}
|
|
801
804
|
notifyIfStale(result, kind, key) {
|
|
802
|
-
if (result.status === internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale ||
|
|
805
|
+
if (result.status === internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale ||
|
|
806
|
+
result.status === internal_location_contracts_1.ZLinkLocationWriteStatus.RejectedConflict) {
|
|
803
807
|
this.metrics?.recordLocationStoreError('compare_exchange');
|
|
804
808
|
}
|
|
805
809
|
if (result.status !== internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale) {
|
|
@@ -810,7 +814,8 @@ class ZLinkLocationRuntime {
|
|
|
810
814
|
}
|
|
811
815
|
}
|
|
812
816
|
notifyIfStaleStatus(status, kind, key) {
|
|
813
|
-
if (status === internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale ||
|
|
817
|
+
if (status === internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale ||
|
|
818
|
+
status === internal_location_contracts_1.ZLinkLocationWriteStatus.RejectedConflict) {
|
|
814
819
|
this.metrics?.recordLocationStoreError('compare_exchange');
|
|
815
820
|
}
|
|
816
821
|
if (status !== internal_location_contracts_1.ZLinkLocationWriteStatus.IgnoredStale) {
|