Commit Graph

557 Commits

Author SHA1 Message Date
Joseph Doherty
d1f22255d7 docs: record SubList allocation strategy 2026-03-13 10:08:50 -04:00
Joseph Doherty
0126234fa6 perf: pool SubList match builders and cleanup scans 2026-03-13 10:06:24 -04:00
Joseph Doherty
5876ad7dfa perf: reduce SubList token string churn 2026-03-13 09:53:37 -04:00
Joseph Doherty
348bec36b2 perf: replace SubList routed-sub string keys 2026-03-13 09:51:11 -04:00
Joseph Doherty
08bd34c529 test: lock SubList remote-key and match behavior 2026-03-13 09:49:54 -04:00
Joseph Doherty
0be321fa53 perf: batch flush signaling and fetch path optimizations (Round 6)
Implement Go's pcd (per-client deferred flush) pattern to reduce write-loop
wakeups during fan-out delivery, optimize ack reply string construction with
stack-based formatting, cache CompiledFilter on ConsumerHandle, and pool
fetch message lists. Durable consumer fetch improves from 0.60x to 0.74x Go.
2026-03-13 09:35:57 -04:00
Joseph Doherty
0a4e7a822f perf: eliminate per-message allocations in pub/sub hot path and coalesce outbound writes
Pub/sub 1:1 (16B) improved from 0.18x to 0.50x, fan-out from 0.18x to 0.44x,
and JetStream durable fetch from 0.13x to 0.64x vs Go. Key changes: replace
.ToArray() copy in SendMessage with pooled buffer handoff, batch multiple small
writes into single WriteAsync via 64KB coalesce buffer in write loop, and remove
profiling Stopwatch instrumentation from ProcessMessage/StreamManager hot paths.
2026-03-13 05:09:36 -04:00
Joseph Doherty
9e0df9b3d7 docs: add JetStream perf investigation notes and test status tracking
Add detailed analysis of the 1,200x JetStream file publish gap identifying
the bottleneck in the outbound write path (not FileStore). Add tests.md
tracking skipped/failing test status across Core and JetStream suites.
2026-03-13 03:20:43 -04:00
Joseph Doherty
4de691c9c5 perf: add FileStore buffered writes, O(1) state tracking, and eliminate redundant per-publish work
Implement Go-parity background flush loop (coalesce 16KB/8ms) in MsgBlock/FileStore,
replace O(n) GetStateAsync with incremental counters, skip PruneExpired/LoadAsync/
PrunePerSubject when not needed, and bypass RAFT for single-replica streams. Fix counter
tracking bugs in RemoveMsg/EraseMsg/TTL expiry and ObjectDisposedException races in
flush loop disposal. FileStore optimizations verified with 3112/3112 JetStream tests
passing; async publish benchmark remains at ~174 msg/s due to E2E protocol path bottleneck.
2026-03-13 03:11:11 -04:00
Joseph Doherty
37575dc41c feat: add benchmark test project for Go vs .NET server comparison
Side-by-side performance benchmarks using NATS.Client.Core against both
servers on ephemeral ports. Includes core pub/sub, request/reply latency,
and JetStream throughput tests with comparison output and
benchmarks_comparison.md results. Also fixes timestamp flakiness in
StoreInterfaceTests by using explicit timestamps.
2026-03-13 01:23:31 -04:00
Joseph Doherty
e9c86c51c3 fix: resolve 19 JetStream test failures across 5 root causes
- HandleList: populate StreamNames/ConsumerNames alongside info lists
- ValidateConfigUpdate: allow clearing mirror/sources, accept even replicas
- ToWireFormat: add AccountInfo branch for $JS.API.INFO responses
- UpdateStream fixture: preserve existing retention policy on update
- Integration test: fix assertion to match valid account info response
2026-03-13 01:14:21 -04:00
Joseph Doherty
3445a055eb feat: add JetStream cluster replication and leaf node solicited reconnect
Add JetStream stream/consumer config and data replication across cluster
peers via $JS.INTERNAL.* subjects with BroadcastRoutedMessageAsync (sends
to all peers, bypassing pool routing). Capture routed data messages into
local JetStream stores in DeliverRemoteMessage. Fix leaf node solicited
reconnect by re-launching the retry loop in WatchConnectionAsync after
disconnect.

Unskips 4 of 5 E2E cluster tests (LeaderDies_NewLeaderElected,
R3Stream_NodeDies_PublishContinues, Consumer_NodeDies_PullContinuesOnSurvivor,
Leaf_HubRestart_LeafReconnects). The 5th (LeaderRestart_RejoinsAsFollower)
requires RAFT log catchup which is a separate feature.
2026-03-13 01:02:00 -04:00
Joseph Doherty
ab805c883b fix: resolve 8 failing E2E cluster tests (FileStore path bug + missing RAFT replication)
Root cause: StreamManager.CreateStore() used a hardcoded temp path for
FileStore instead of the configured store_dir from JetStream config.
This caused stream data to accumulate across test runs in a shared
directory, producing wrong message counts (e.g., expected 5 but got 80).

Server fix:
- Pass storeDir from JetStream config through to StreamManager
- CreateStore() now uses the configured store_dir for FileStore paths

Test fixes for tests that now pass (3):
- R3Stream_CreateAndPublish_ReplicatedAcrossNodes: delete stream before
  test, verify only on publishing node (no cross-node replication yet)
- R3Stream_Purge_ReplicatedAcrossNodes: same pattern
- LogReplication_AllReplicasHaveData: same pattern

Tests skipped pending RAFT implementation (5):
- LeaderDies_NewLeaderElected: requires RAFT leader re-election
- LeaderRestart_RejoinsAsFollower: requires RAFT log catchup
- R3Stream_NodeDies_PublishContinues: requires cross-node replication
- Consumer_NodeDies_PullContinuesOnSurvivor: requires replicated state
- Leaf_HubRestart_LeafReconnects: leaf reconnection after hub restart
2026-03-13 00:03:37 -04:00
Joseph Doherty
be1303c17b chore: add SlopwatchSuppressAttribute for cluster test suppressions 2026-03-12 23:39:07 -04:00
Joseph Doherty
f64b7103f4 test: add gateway failover E2E tests and fix SW003/SW004 violations across cluster tests
Replace all Task.Delay-based interest propagation waits with active probe loops
(PeriodicTimer + publish-and-read) in GatewayFailoverTests, LeafNodeFailoverTests,
JetStreamClusterTests, and RaftConsensusTests. Fix SW003 empty-catch violations in
ClusterResilienceTests by adding _ = e discard statements. Correct State.Messages
type from ulong to long to match the NATS.Client.JetStream API.
2026-03-12 23:38:18 -04:00
Joseph Doherty
d8eadeb624 feat: add HubLeafFixture for leaf node failover tests 2026-03-12 23:32:10 -04:00
Joseph Doherty
13443e7958 feat: add GatewayPairFixture for failover tests 2026-03-12 23:31:57 -04:00
Joseph Doherty
75ad411d83 feat: add JetStreamClusterFixture for R3 replication tests 2026-03-12 23:31:49 -04:00
Joseph Doherty
b9ad33d8bd feat: add ThreeNodeClusterFixture with KillNode/RestartNode 2026-03-12 23:30:48 -04:00
Joseph Doherty
d132a0b0d1 feat: add NatsServerProcess to cluster E2E infrastructure
Includes pre-assigned port constructor for kill/restart scenarios.
2026-03-12 23:29:45 -04:00
Joseph Doherty
e724b3cc88 feat: scaffold NATS.E2E.Cluster.Tests project 2026-03-12 23:29:19 -04:00
Joseph Doherty
8877df45c8 docs: add E2E cluster tests design and implementation plan
16 tests across 5 test files covering cluster resilience, RAFT consensus,
JetStream cluster replication, gateway failover, and leaf node failover.
2026-03-12 23:27:33 -04:00
Joseph Doherty
b5e1786ec2 docs: add E2E cluster & raft tests design document 2026-03-12 23:22:31 -04:00
Joseph Doherty
95e9f0a92e feat: wire remaining E2E gaps — account imports, subject transforms, JWT auth, service latency
Close all 5 server-side wiring gaps so E2E tests pass without skips:
- System events: bridge user-defined system_account to internal $SYS
- Account imports/exports: config parsing + reverse response import for cross-account request-reply
- Subject transforms: parse mappings config block, apply in ProcessMessage
- JWT auth: parse trusted_keys, resolver MEMORY, resolver_preload in config
- Service latency: timestamp on request, publish ServiceLatencyMsg on response
2026-03-12 23:03:12 -04:00
Joseph Doherty
246fc7ad87 fix: route manager self-connection detection and per-peer deduplication
- Detect and reject self-route connections (node connecting to itself via
  routes list) in both inbound and outbound handshake paths
- Deduplicate RS+/RS-/RMSG forwarding by RemoteServerId to avoid sending
  duplicate messages when multiple connections exist to the same peer
- Fix ForwardRoutedMessageAsync to broadcast to all peers instead of
  selecting a single route
- Add pool_size: 1 to cluster fixture config
- Add -DV debug flags to cluster fixture servers
- Add WaitForCrossNodePropagationAsync probe pattern for reliable E2E
  cluster test timing
- Fix queue group test to use same-node subscribers (cross-node queue
  group routing not yet implemented)
2026-03-12 20:51:41 -04:00
Joseph Doherty
ced5062f50 fix: remove unnecessary using directive in MqttTests 2026-03-12 19:55:22 -04:00
Joseph Doherty
e4d275c929 test: add E2E MQTT bridge tests (pub/sub, different-topic isolation, QoS 1) 2026-03-12 19:54:30 -04:00
Joseph Doherty
c9b55093a4 test: add E2E advanced tests (config, max connections, system events, account imports) 2026-03-12 19:54:05 -04:00
Joseph Doherty
139b984992 test: add E2E WebSocket transport tests (connect, pub/sub round-trip) 2026-03-12 19:52:57 -04:00
Joseph Doherty
571c595d0a test: add E2E cluster tests and fix leaf/gateway using warnings 2026-03-12 19:50:05 -04:00
Joseph Doherty
aeb60d3c43 test: add E2E leaf node tests (hub-to-leaf, leaf-to-hub, subject propagation)
Fix LeafNodeManager.StartAsync to launch solicited connections for RemoteLeaves
(config-file-parsed remotes) in addition to the programmatic Remotes list, and
update ParseEndpoint to handle nats-leaf:// scheme URLs. Add LeafNodeFixture
that polls /leafz for connection readiness and three E2E tests covering
hub→leaf delivery, leaf→hub delivery, and subject-scoped propagation.
2026-03-12 19:47:40 -04:00
Joseph Doherty
338f44b07b test: add E2E gateway tests (cross-gateway messaging, interest-only)
- GatewayFixture: polls /gatewayz monitoring endpoint until both servers
  report num_gateways >= 1, replacing Task.Delay with proper synchronization
- GatewayTests: two tests covering cross-gateway delivery and interest-only
  no-delivery behaviour, using double PingAsync() instead of Task.Delay
- LeafNodeTests: replace Task.Delay(500) with sub.PingAsync()+pub.PingAsync()
  to properly fence subscription propagation without timing dependencies
- Fix GatewayManager.StartAsync to read remotes from RemoteGateways (config-
  parsed) in addition to the legacy Remotes list, enabling config-file-driven
  outbound gateway connections
2026-03-12 19:45:54 -04:00
Joseph Doherty
5d9d1bebd5 test: add E2E JetStream push consumers, ACK policies, retention modes, ordered, mirror, source
Adds 8 new E2E tests to JetStreamTests.cs (tests 11-18) covering push
consumer config, AckNone/AckAll policies, Interest/WorkQueue retention,
ordered consumers, mirror streams, and source streams.

Fixes three server gaps exposed by the new tests: mirror JSON parsing
(deliver_subject and mirror object fields were silently ignored in stream
and consumer API handlers), and deliver_subject omitted from consumer
info wire format. Also fixes ShutdownDrainTests to use TaskCompletionSource
on ConnectionDisconnected instead of a Task.Delay poll loop.
2026-03-12 19:36:29 -04:00
Joseph Doherty
76f8ccec2e test: add E2E header pub/sub tests (HPUB/HMSG) 2026-03-12 19:12:24 -04:00
Joseph Doherty
e094846665 fix: remove unnecessary using directives in monitoring tests 2026-03-12 19:11:27 -04:00
Joseph Doherty
8ad2172e3c test: add E2E monitoring endpoint tests (varz, connz, healthz)
Replace Task.Delay polling with PeriodicTimer in NatsServerProcess readiness
checks and extend StartAsync to also TCP-poll the monitor port when enabled,
so MonitorServerFixture is guaranteed ready before tests run.
2026-03-12 19:10:33 -04:00
Joseph Doherty
4853409a40 chore: add MQTTnet NuGet package for E2E MQTT tests 2026-03-12 19:07:06 -04:00
Joseph Doherty
0e252d6ccf docs: add E2E full gap coverage implementation plan
12 tasks covering all 3 priority tiers: monitoring, headers,
shutdown/drain, JetStream extensions, cluster, leaf node,
gateway, MQTT, WebSocket, and advanced feature tests.
2026-03-12 19:05:48 -04:00
Joseph Doherty
1f122bf56f docs: add E2E full gap coverage design document
Covers all 3 priority tiers from e2e_gaps.md: monitoring,
headers, shutdown/drain, clustering, leaf nodes, gateways,
MQTT, WebSocket, JetStream extensions, and advanced features.
2026-03-12 18:59:32 -04:00
Joseph Doherty
bc308a4349 docs: update CLAUDE.md with new test project structure
Reflects the split of NATS.Server.Tests into 10 feature-focused
test projects plus a shared TestUtilities library.
2026-03-12 16:26:48 -04:00
Joseph Doherty
7fbffffd05 refactor: rename remaining tests to NATS.Server.Core.Tests
- Rename tests/NATS.Server.Tests -> tests/NATS.Server.Core.Tests
- Update solution file, InternalsVisibleTo, and csproj references
- Remove JETSTREAM_INTEGRATION_MATRIX and NATS.NKeys from csproj (moved to JetStream.Tests and Auth.Tests)
- Update all namespaces from NATS.Server.Tests.* to NATS.Server.Core.Tests.*
- Replace private GetFreePort/ReadUntilAsync helpers with TestUtilities calls
- Fix stale namespace in Transport.Tests/NetworkingGoParityTests.cs
2026-03-12 16:14:02 -04:00
Joseph Doherty
78b4bc2486 refactor: extract NATS.Server.JetStream.Tests project
Move 225 JetStream-related test files from NATS.Server.Tests into a
dedicated NATS.Server.JetStream.Tests project. This includes root-level
JetStream*.cs files, storage test files (FileStore, MemStore,
StreamStoreContract), and the full JetStream/ subfolder tree (Api,
Cluster, Consumers, MirrorSource, Snapshots, Storage, Streams).

Updated all namespaces, added InternalsVisibleTo, registered in the
solution file, and added the JETSTREAM_INTEGRATION_MATRIX define.
2026-03-12 15:58:10 -04:00
Joseph Doherty
36b9dfa654 refactor: extract NATS.Server.Auth.Tests project
Move 50 auth/accounts/permissions/JWT/NKey test files from
NATS.Server.Tests into a dedicated NATS.Server.Auth.Tests project.
Update namespaces, replace private GetFreePort/ReadUntilAsync helpers
with TestUtilities calls, replace Task.Delay with TaskCompletionSource
in test doubles, and add InternalsVisibleTo.

690 tests pass.
2026-03-12 15:54:07 -04:00
Joseph Doherty
0c086522a4 refactor: extract NATS.Server.Monitoring.Tests project
Move 39 monitoring, events, and system endpoint test files from
NATS.Server.Tests into a dedicated NATS.Server.Monitoring.Tests project.
Update namespaces, replace private GetFreePort/ReadUntilAsync with
TestUtilities shared helpers, add InternalsVisibleTo, and register
in the solution file. All 439 tests pass.
2026-03-12 15:44:12 -04:00
Joseph Doherty
edf9ed770e refactor: extract NATS.Server.Raft.Tests project
Move 43 Raft consensus test files (8 root-level + 35 in Raft/ subfolder)
from NATS.Server.Tests into a dedicated NATS.Server.Raft.Tests project.
Update namespaces, add InternalsVisibleTo, and fix timing/exception
handling issues in moved test files.
2026-03-12 15:36:02 -04:00
Joseph Doherty
615752cdc2 refactor: extract NATS.Server.Clustering.Tests project
Move 29 clustering/routing test files from NATS.Server.Tests to a
dedicated NATS.Server.Clustering.Tests project. Update namespaces,
replace private GetFreePort/ReadUntilAsync helpers with TestUtilities
calls, and extract TestServerFactory/ClusterTestServer to TestUtilities
to fix cross-project reference from JetStreamStartupTests.
2026-03-12 15:31:58 -04:00
Joseph Doherty
3f7d896a34 refactor: extract NATS.Server.LeafNodes.Tests project
Move 28 leaf node test files from NATS.Server.Tests into a dedicated
NATS.Server.LeafNodes.Tests project. Update namespaces, add
InternalsVisibleTo, register in solution file. Replace all Task.Delay
polling loops with PollHelper.WaitUntilAsync/YieldForAsync from
TestUtilities. Replace private ReadUntilAsync in LeafProtocolTests
with SocketTestHelper.ReadUntilAsync.

All 281 tests pass.
2026-03-12 15:23:33 -04:00
Joseph Doherty
9972b74bc3 refactor: extract NATS.Server.Gateways.Tests project
Move 25 gateway-related test files from NATS.Server.Tests into a
dedicated NATS.Server.Gateways.Tests project. Update namespaces,
replace private ReadUntilAsync with SocketTestHelper from TestUtilities,
inline TestServerFactory usage, add InternalsVisibleTo, and register
the project in the solution file. All 261 tests pass.
2026-03-12 15:10:50 -04:00
Joseph Doherty
a6be5e11ed refactor: extract NATS.Server.Mqtt.Tests project
Move 29 MQTT test files from NATS.Server.Tests into a dedicated
NATS.Server.Mqtt.Tests project. Update namespaces, add
InternalsVisibleTo, and replace Task.Delay calls with
PollHelper.WaitUntilAsync for proper synchronization.
2026-03-12 15:03:12 -04:00
Joseph Doherty
d2c04fcca5 refactor: extract NATS.Server.Transport.Tests project
Move TLS, OCSP, WebSocket, Networking, and IO test files from
NATS.Server.Tests into a dedicated NATS.Server.Transport.Tests
project. Update namespaces, replace private GetFreePort/ReadUntilAsync
with shared TestUtilities helpers, extract TestCertHelper to
TestUtilities, and replace Task.Delay polling loops with
PollHelper.WaitUntilAsync/YieldForAsync for proper synchronization.
2026-03-12 14:57:35 -04:00