@@ -41,7 +41,7 @@ import Cardano.Node.Configuration.POM (NodeConfiguration (..),
4141 defaultPartialNodeConfiguration , makeNodeConfiguration ,
4242 parseNodeConfigurationFP , getForkPolicy )
4343import Cardano.Node.Configuration.Socket (LocalSocketOrSocketInfo ,
44- SocketOrSocketInfo , SocketOrSocketInfo' (.. ),
44+ SocketConfig ( .. ), SocketOrSocketInfo , SocketOrSocketInfo' (.. ),
4545 gatherConfiguredSockets , getSocketOrSocketInfoAddr )
4646import Cardano.Node.Configuration.TopologyP2P
4747import qualified Cardano.Node.Configuration.TopologyP2P as TopologyP2P
@@ -137,6 +137,7 @@ import Control.Monad.Trans.Maybe (MaybeT(runMaybeT, MaybeT), hoistMayb
137137import "contra-tracer" Control.Tracer
138138import Data.Bits
139139import Data.Either (partitionEithers )
140+ import Data.Functor.Identity (Identity (.. ))
140141import Data.IP (toSockAddr )
141142import Data.Map.Strict (Map )
142143import qualified Data.Map.Strict as Map
@@ -473,6 +474,7 @@ handleSimpleNode blockType runP tracers nc onKernel = do
473474 (readTVar ledgerPeerSnapshotPathVar)
474475 (readTVar useLedgerVar)
475476 (const . pure $ () )
477+ rpcConfigVar <- newTVarIO (ncRpcConfig nc)
476478
477479 let nodeArgs = RunNodeArgs
478480 { rnGenesisConfig = ncGenesisConfig nc
@@ -518,6 +520,7 @@ handleSimpleNode blockType runP tracers nc onKernel = do
518520 (readTVar ledgerPeerSnapshotPathVar)
519521 (readTVar useLedgerVar)
520522 (writeTVar ledgerPeerSnapshotVar)
523+ updateRpcConfiguration (startupTracer tracers) nc rpcConfigVar
521524 traceWith (startupTracer tracers) (BlockForgingUpdate NotEffective )
522525 )
523526 Nothing
@@ -557,14 +560,26 @@ handleSimpleNode blockType runP tracers nc onKernel = do
557560
558561 ProtocolInfo {pInfoConfig} = fst $ Api. protocolInfo @ IO runP
559562 networkMagic :: Api. NetworkMagic = getNetworkMagic $ Consensus. configBlock pInfoConfig
560- withAsync (runRpcServer (rpcTracer tracers) (pure (ncRpcConfig nc, networkMagic))) $ \ _ ->
563+ let rpcServerLoop = do
564+ config <- readTVarIO rpcConfigVar
565+ let RpcConfig {isEnabled = Identity enabled} = config
566+ if enabled
567+ then
568+ race_
569+ (runRpcServer (rpcTracer tracers) (pure (config, networkMagic)))
570+ (atomically $ readTVar rpcConfigVar >>= \ new -> check (new /= config))
571+ else
572+ atomically $ readTVar rpcConfigVar >>= \ new -> check (new /= config)
573+ rpcServerLoop
574+ withAsync rpcServerLoop $ \ _ ->
561575 Node. run
562576 nodeArgs {
563577 rnNodeKernelHook = \ registry nodeKernel -> do
564578 -- reinstall `SIGHUP` handler
565579 installSigHUPHandler (startupTracer tracers) (Consensus. kesAgentTracer $ consensusTracers tracers) blockType nc nodeKernel
566580 localRootsVar publicRootsVar useLedgerVar useBootstrapVar
567581 ledgerPeerSnapshotPathVar ledgerPeerSnapshotVar
582+ rpcConfigVar
568583 rnNodeKernelHook nodeArgs registry nodeKernel
569584 }
570585 StdRunNodeArgs
@@ -665,12 +680,14 @@ installSigHUPHandler :: Tracer IO (StartupTrace blk)
665680 -> StrictTVar IO UseBootstrapPeers
666681 -> StrictTVar IO (Maybe PeerSnapshotFile )
667682 -> StrictTVar IO (Maybe LedgerPeerSnapshot )
683+ -> StrictTVar IO RpcConfig
668684 -> IO ()
669685#ifndef UNIX
670- installSigHUPHandler _ _ _ _ _ _ _ _ _ _ _ = return ()
686+ installSigHUPHandler _ _ _ _ _ _ _ _ _ _ _ _ = return ()
671687#else
672688installSigHUPHandler startupTracer kesAgentTracer blockType nc nodeKernel localRootsVar publicRootsVar useLedgerVar
673- useBootstrapPeersVar ledgerPeerSnapshotPathVar ledgerPeerSnapshotVar =
689+ useBootstrapPeersVar ledgerPeerSnapshotPathVar ledgerPeerSnapshotVar
690+ rpcConfigVar =
674691 void $ Signals. installHandler
675692 Signals. sigHUP
676693 (Signals. Catch $ do
@@ -683,6 +700,7 @@ installSigHUPHandler startupTracer kesAgentTracer blockType nc nodeKernel localR
683700 (readTVar ledgerPeerSnapshotPathVar)
684701 (readTVar useLedgerVar)
685702 (writeTVar ledgerPeerSnapshotVar)
703+ updateRpcConfiguration startupTracer nc rpcConfigVar
686704 )
687705 Nothing
688706#endif
@@ -820,6 +838,29 @@ updateLedgerPeerSnapshot startupTracer (NodeConfiguration {ncConsensusMode}) rea
820838
821839 mLedgerPeerSnapshot <$ atomically (writeVar mLedgerPeerSnapshot)
822840
841+ updateRpcConfiguration :: Tracer IO (StartupTrace blk )
842+ -> NodeConfiguration
843+ -> StrictTVar IO RpcConfig
844+ -> IO ()
845+ #ifndef UNIX
846+ updateRpcConfiguration _ _ _ = return ()
847+ #else
848+ updateRpcConfiguration tracer nc rpcConfigVar = do
849+ result <- try @ IOException $ do
850+ configYamlPc <- parseNodeConfigurationFP (Just (ncConfigFile nc))
851+ pure $ makeRpcConfig (pncRpcConfig configYamlPc){nodeSocketPath = ncSocketPath (ncSocketConfig nc)}
852+ case result of
853+ Left e ->
854+ traceWith tracer (RpcConfigUpdateError (pack $ Exception. displayException e))
855+ Right (Left err) ->
856+ traceWith tracer (RpcConfigUpdateError (pack err))
857+ Right (Right newConfig) -> do
858+ oldConfig <- readTVarIO rpcConfigVar
859+ when (oldConfig /= newConfig) $ do
860+ atomically $ writeTVar rpcConfigVar newConfig
861+ traceWith tracer RpcConfigUpdate
862+ #endif
863+
823864--------------------------------------------------------------------------------
824865-- Helper functions
825866--------------------------------------------------------------------------------
0 commit comments