@@ -2329,3 +2329,115 @@ func TestJetStreamClusterAckFloorBetweenLeaderAndFollowers(t *testing.T) {
2329
2329
}
2330
2330
}
2331
2331
}
2332
+
2333
+ func TestJetStreamClusterAccountNRG (t * testing.T ) {
2334
+ c := createJetStreamClusterExplicit (t , "R3S" , 3 )
2335
+ defer c .shutdown ()
2336
+
2337
+ nc , js := jsClientConnect (t , c .randomServer ())
2338
+ defer nc .Close ()
2339
+
2340
+ snc , _ := jsClientConnect (t , c .randomServer (), nats .UserInfo ("admin" , "s3cr3t!" ))
2341
+ defer snc .Close ()
2342
+
2343
+ _ , err := js .AddStream (& nats.StreamConfig {
2344
+ Name : "TEST" ,
2345
+ Subjects : []string {"foo" },
2346
+ Storage : nats .MemoryStorage ,
2347
+ Retention : nats .WorkQueuePolicy ,
2348
+ Replicas : 3 ,
2349
+ })
2350
+ require_NoError (t , err )
2351
+
2352
+ leader := c .streamLeader (globalAccountName , "TEST" )
2353
+ stream , err := leader .gacc .lookupStream ("TEST" )
2354
+ require_NoError (t , err )
2355
+ rg := stream .node .(* raft )
2356
+
2357
+ // System account should have interest, but the global account
2358
+ // shouldn't.
2359
+ for _ , s := range c .servers {
2360
+ require_True (t , s .sys .account .sl .hasInterest (rg .asubj , true ))
2361
+ require_False (t , s .gacc .sl .hasInterest (rg .asubj , true ))
2362
+ }
2363
+
2364
+ // Check that varz tells us what we expect.
2365
+ // set a header to make sure request parsing knows to ignore them
2366
+ ri := snc .NewRespInbox ()
2367
+ replies , err := snc .SubscribeSync (ri )
2368
+ require_NoError (t , err )
2369
+ require_NoError (t , snc .PublishMsg (& nats.Msg {
2370
+ Subject : "$SYS.REQ.SERVER.PING.VARZ" ,
2371
+ Reply : ri ,
2372
+ }))
2373
+ for i := 0 ; i < len (c .servers ); i ++ {
2374
+ msg , err := replies .NextMsg (time .Second * 5 )
2375
+ require_NoError (t , err )
2376
+ var v Varz
2377
+ require_NoError (t , json .Unmarshal (msg .Data , & v ))
2378
+ //require_Equal(t, v.JetStream.Config.AccountNRG, false)
2379
+ require_Equal (t , v .JetStream .AccountNRGActive , false )
2380
+ }
2381
+ p , _ , _ := replies .Pending ()
2382
+ require_Equal (t , p , 0 )
2383
+
2384
+ // First of all check that the Raft traffic is in the system
2385
+ // account, as we haven't moved it elsewhere yet.
2386
+ {
2387
+ sub , err := snc .SubscribeSync (rg .asubj )
2388
+ require_NoError (t , err )
2389
+ require_NoError (t , sub .AutoUnsubscribe (1 ))
2390
+
2391
+ msg , err := sub .NextMsg (time .Second * 3 )
2392
+ require_NoError (t , err )
2393
+ require_True (t , msg != nil )
2394
+ }
2395
+
2396
+ // Switch on account NRG on all servers in the cluster. Then
2397
+ // we wait, as we will need statsz to be sent for all servers
2398
+ // in the cluster.
2399
+ for _ , s := range c .servers {
2400
+ s .optsMu .Lock ()
2401
+ s .opts .JetStreamAccountNRG = true
2402
+ s .optsMu .Unlock ()
2403
+ s .updateNRGAccountStatus ()
2404
+ }
2405
+
2406
+ // Now check that the traffic has moved into the asset acc.
2407
+ // In this case the system account should no longer have
2408
+ // subscriptions for those subjects.
2409
+ {
2410
+ sub , err := nc .SubscribeSync (rg .asubj )
2411
+ require_NoError (t , err )
2412
+ require_NoError (t , sub .AutoUnsubscribe (1 ))
2413
+
2414
+ msg , err := sub .NextMsg (time .Second * 3 )
2415
+ require_NoError (t , err )
2416
+ require_True (t , msg != nil )
2417
+ }
2418
+
2419
+ // The global account should now have interest and the
2420
+ // system account shouldn't.
2421
+ for _ , s := range c .servers {
2422
+ require_False (t , s .sys .account .sl .hasInterest (rg .asubj , true ))
2423
+ require_True (t , s .gacc .sl .hasInterest (rg .asubj , true ))
2424
+ }
2425
+
2426
+ // Check varz again.
2427
+ require_NoError (t , snc .PublishMsg (& nats.Msg {
2428
+ Subject : "$SYS.REQ.SERVER.PING.VARZ" ,
2429
+ Reply : ri ,
2430
+ }))
2431
+ for i := 0 ; i < len (c .servers ); i ++ {
2432
+ msg , err := replies .NextMsg (time .Second * 5 )
2433
+ require_NoError (t , err )
2434
+ var v Varz
2435
+ //Server Varz `json:"server"`
2436
+ //}
2437
+ require_NoError (t , json .Unmarshal (msg .Data , & v ))
2438
+ t .Logf ("JSON: %s" , msg .Data )
2439
+ t .Logf ("Varz: %+v" , v )
2440
+ //require_Equal(t, v.JetStream.Config.AccountNRG, true)
2441
+ //require_Equal(t, v.JetStream.AccountNRGActive, true)
2442
+ }
2443
+ }
0 commit comments