3f24d4d6bf
Akka runs FirstSeedNodeProcess -- the only bootstrap path that can form a NEW
cluster when no peer answers InitJoin -- exclusively when seed-nodes[0] is the
node's own address. Every other node runs JoinSeedNodeProcess and retries
InitJoin forever. That is why "both peers are seeds" never meant "either can
cold-start alone", and it is fixed here the way Akka itself intends: each seed
node lists ITSELF first.
- docker-dev central-2 now lists itself as SeedNodes__0 (central-1 was already
self-first). The site nodes are untouched -- they seed off central-1 only and
are deliberately not seeds.
- AkkaClusterOptionsValidator enforces the invariant at boot via the shared
ZB.MOM.WW.Configuration AddValidatedOptions/ValidateOnStart seam. The rule is
CONDITIONAL -- self must be seed[0] only IF self is in the list at all -- or it
would refuse to boot every driver-only site node. Identity is compared on
PublicHostname (falling back to Hostname when blank) AND port, i.e. the address
Akka puts in SelfAddress: matching the 0.0.0.0 bind address would find no seed
anywhere and leave the rule silently inert on the whole docker-dev rig.
- ClusterBootstrapFallback + Cluster:SelfFormAfter are DELETED. The watchdog sat
outside Akka's join handshake, so it could not distinguish "no seed answered"
from "a seed answered and the join is in flight" -- and Cluster.Join(SelfAddress)
is not ignored mid-handshake, it wins. The live gate (ea45ace1) caught it
islanding a node that a manual failover had bounced: InitJoinAck received, no
Welcome inside the window because the peer's ring still held the old
incarnation, watchdog fired, second cluster. The TCP reachability guard patched
that one shape; the race stayed. It was also inert for every non-seed node, so
after this change it can never usefully fire.
- SelfFormBootstrapTests -> SelfFirstSeedBootstrapTests: real in-process clusters
through the production bootstrap at production failure-detection timings, incl.
a falsifiability control proving the OLD peer-first ordering never forms (that
test failed at 11s against the watchdog, which is what proved the retirement),
the restart-into-a-live-peer case that killed the watchdog, and a simultaneous
cold start converging on ONE cluster.
Mirrors ScadaBridge 4a6341d8; anticipates per-cluster-mesh-program Phase 6, which
had this retirement queued.
43 lines
2.0 KiB
XML
43 lines
2.0 KiB
XML
<Project Sdk="Microsoft.NET.Sdk">
|
|
|
|
<PropertyGroup>
|
|
<RootNamespace>ZB.MOM.WW.OtOpcUa.Cluster</RootNamespace>
|
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup>
|
|
<PackageReference Include="Akka.Hosting"/>
|
|
<PackageReference Include="Akka.Cluster"/>
|
|
<PackageReference Include="Akka.Cluster.Hosting"/>
|
|
<PackageReference Include="Akka.Cluster.Tools"/>
|
|
<PackageReference Include="Akka.Logger.Serilog"/>
|
|
<PackageReference Include="Akka.Remote.Hosting"/>
|
|
<PackageReference Include="Microsoft.Extensions.Hosting"/>
|
|
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions"/>
|
|
<!-- Shared options-validation primitives (OptionsValidatorBase / AddValidatedOptions), the
|
|
same seam the Host's Ldap/OpcUa/Historian validators use. Pulled in here because the
|
|
self-first seed-ordering rule belongs with the options it validates. -->
|
|
<PackageReference Include="ZB.MOM.WW.Configuration"/>
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- Security pin: OpenTelemetry.Api is pulled transitively at 1.9.0, which carries
|
|
GHSA-g94r-2vxg-569j (header-parse memory DoS, Moderate). Force the patched 1.15.3
|
|
(the meta + ProviderBuilderExtensions move in lockstep). Pinning on this low-level
|
|
project lifts the whole server stack — Runtime / ControlPlane / AdminUI and their
|
|
test projects inherit 1.15.3 via project reference (highest-version-wins). -->
|
|
<PackageReference Include="OpenTelemetry"/>
|
|
<PackageReference Include="OpenTelemetry.Api"/>
|
|
<PackageReference Include="OpenTelemetry.Api.ProviderBuilderExtensions"/>
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\ZB.MOM.WW.OtOpcUa.Commons\ZB.MOM.WW.OtOpcUa.Commons.csproj"/>
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<EmbeddedResource Include="Resources\akka.conf"/>
|
|
</ItemGroup>
|
|
|
|
</Project>
|