Skip to content

Commit

Permalink
Fix #574: chairman socket path
Browse files Browse the repository at this point in the history
Chairman --socket-path argument can be given multiple times.  It
indicates to which unix sockets to connect to (and check for consensus).

Chairman now identifies nodes by `SocketPath`, `CoreNodeId` is
not used now, maybe it can be removed from `ourobors-consensus` as well.

Nix scripts are not updated, and need to accomodate for chairman CLI
changes.
  • Loading branch information
coot committed Feb 17, 2020
1 parent e88e3e1 commit 6d6a9d6
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 51 deletions.
2 changes: 1 addition & 1 deletion cardano-config/src/Cardano/Config/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ newtype DelegationCertFile = DelegationCertFile

data SocketPath = SocketFile
{ unSocket :: FilePath }
deriving Show
deriving (Eq, Ord, Show)

newtype SigningKeyFile = SigningKeyFile
{ unSigningKey :: FilePath }
Expand Down
20 changes: 8 additions & 12 deletions cardano-node/app/chairman.hs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import Control.Tracer (stdoutTracer)

import Ouroboros.Network.Block (BlockNo)
import Ouroboros.Consensus.Protocol.Abstract (SecurityParam (..))
import Ouroboros.Consensus.NodeId (CoreNodeId)

import Cardano.Config.CommonCLI
import Cardano.Config.Protocol ( ProtocolInstantiationError
Expand All @@ -29,14 +28,13 @@ import Cardano.Chairman (runChairman)

main :: IO ()
main = do
ChairmanArgs { caCoreNodeIds
, caSecurityParam
ChairmanArgs { caSecurityParam
, caMaxBlockNo
, caTimeout
, caTimeoutType
, caGenesisFile
, caGenesisHash
, caSocketDir
, caSocketPaths
, caConfigYaml
, caSigningKeyFp
, caDelegationCertFp
Expand All @@ -60,10 +58,10 @@ main = do
Left err -> do putTextLn $ renderPtclInstantiationErr err
exitFailure

let run = runChairman p caCoreNodeIds
let run = runChairman p
caSecurityParam
caMaxBlockNo
caSocketDir
caSocketPaths
stdoutTracer

case caTimeout of
Expand All @@ -87,8 +85,7 @@ data TimeoutType
deriving (Eq, Show)

data ChairmanArgs = ChairmanArgs {
caCoreNodeIds :: ![CoreNodeId]
, caSecurityParam :: !SecurityParam
caSecurityParam :: !SecurityParam
-- | stop after seeing given block number
, caMaxBlockNo :: !(Maybe BlockNo)
-- | timeout after given number of seconds, this is useful in combination
Expand All @@ -102,7 +99,7 @@ data ChairmanArgs = ChairmanArgs {
, caTimeoutType :: !TimeoutType
, caGenesisFile :: !GenesisFile
, caGenesisHash :: !Text
, caSocketDir :: !SocketPath
, caSocketPaths :: ![SocketPath]
, caConfigYaml :: !ConfigYamlFilePath
, caSigningKeyFp :: !(Maybe SigningKeyFile)
, caDelegationCertFp :: !(Maybe DelegationCertFile)
Expand Down Expand Up @@ -138,15 +135,14 @@ parseTimeout =
parseChairmanArgs :: Parser ChairmanArgs
parseChairmanArgs =
ChairmanArgs
<$> some parseCoreNodeId
<*> parseSecurityParam
<$> parseSecurityParam
<*> optional parseSlots
<*> optional parseTimeout
<*> parseFlag' FailureTimeout SuccessTimeout
"timeout-is-success" "Exit successfully on timeout."
<*> (GenesisFile <$> parseGenesisPath)
<*> parseGenesisHash
<*> parseSocketPath "Path to a cardano-node socket"
<*> (some $ parseSocketPath "Path to a cardano-node socket")
<*> (ConfigYamlFilePath <$> parseConfigFile)
<*> (optional $ SigningKeyFile <$> parseSigningKey)
<*> (optional $ DelegationCertFile <$> parseDelegationCert)
Expand Down
59 changes: 27 additions & 32 deletions cardano-node/src/Cardano/Chairman.hs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ import Ouroboros.Consensus.Block (BlockProtocol, GetHeader (..))
import Ouroboros.Consensus.Mempool
import Ouroboros.Consensus.Node.ProtocolInfo
import Ouroboros.Consensus.Node.Run
import Ouroboros.Consensus.NodeId
import Ouroboros.Consensus.Protocol
import Ouroboros.Consensus.Util.Condense

Expand Down Expand Up @@ -75,44 +74,42 @@ runChairman :: forall blk.
, TraceConstraints blk
)
=> Protocol blk
-> [CoreNodeId]
-> SecurityParam
-- ^ security parameter, if a fork is deeper than it 'runChairman'
-- will throw an exception.
-> Maybe BlockNo
-- ^ finish after that many blocks, if 'Nothing' run continuously.
-> SocketPath
-> [SocketPath]
-- ^ local socket dir
-> Tracer IO String
-> IO ()
runChairman ptcl nids securityParam maxBlockNo socketDir tracer = do
runChairman ptcl securityParam maxBlockNo socketPaths tracer = do

(chainsVar :: ChainsVar IO blk) <- newTVarM
(Map.fromList $ map (\coreNodeId -> (coreNodeId, AF.Empty AF.AnchorGenesis)) nids)
(Map.fromList $ map (\socketPath -> (socketPath, AF.Empty AF.AnchorGenesis)) socketPaths)

void $ flip mapConcurrently nids $ \coreNodeId ->
void $ flip mapConcurrently socketPaths $ \sockPath ->
let ProtocolInfo{pInfoConfig} = protocolInfo ptcl

in createConnection
coreNodeId
chainsVar
securityParam
maxBlockNo
tracer
pInfoConfig
socketDir
sockPath

-- catch 'MuxError'; it will be thrown if a node shuts down closing the
-- connection.
handleMuxError
:: Tracer IO String
-> ChainsVar IO blk
-> CoreNodeId
-> SocketPath
-> MuxError
-> IO ()
handleMuxError tracer chainsVar coreNodeId err = do
handleMuxError tracer chainsVar socketPath err = do
traceWith tracer (show err)
atomically $ modifyTVar chainsVar (Map.delete coreNodeId)
atomically $ modifyTVar chainsVar (Map.delete socketPath)

createConnection
:: forall blk.
Expand All @@ -121,30 +118,28 @@ createConnection
, Condense (Header blk)
, Condense (HeaderHash blk)
)
=> CoreNodeId
-> ChainsVar IO blk
=> ChainsVar IO blk
-> SecurityParam
-> Maybe BlockNo
-> Tracer IO String
-> NodeConfig (BlockProtocol blk)
-> SocketPath
-> IO ()
createConnection
coreNodeId
chainsVar
securityParam
maxBlockNo
tracer
pInfoConfig
socketFp = do
addr <- localSocketAddrInfo socketFp
socketPath = do
addr <- localSocketAddrInfo socketPath
connectTo
NetworkConnectTracers {
nctMuxTracer = nullTracer,
nctHandshakeTracer = nullTracer
}
(localInitiatorNetworkApplication
coreNodeId
socketPath
chainsVar
securityParam
maxBlockNo
Expand All @@ -154,7 +149,7 @@ createConnection
pInfoConfig)
Nothing
addr
`catch` handleMuxError tracer chainsVar coreNodeId
`catch` handleMuxError tracer chainsVar socketPath

data ChairmanTrace blk
= WitnessedConsensus [Point (Header blk)]
Expand All @@ -177,7 +172,7 @@ instance (Condense blk, Condense (HeaderHash blk)) => Show (ChairmanTrace blk) w
-- | Shared state between chain-sync clients. Each chain-sync client will write to the
-- corresponding entry.
--
type ChainsVar m blk = StrictTVar m (Map CoreNodeId (AnchoredFragment (Header blk)))
type ChainsVar m blk = StrictTVar m (Map SocketPath (AnchoredFragment (Header blk)))


-- | Add a single block to the chain.
Expand All @@ -188,12 +183,12 @@ addBlock
, HasHeader (Header blk)
, GetHeader blk
)
=> CoreNodeId
=> SocketPath
-> ChainsVar m blk
-> blk
-> STM m ()
addBlock coreNodeId chainsVar blk =
modifyTVar chainsVar (Map.adjust (AF.addBlock (getHeader blk)) coreNodeId)
addBlock sockPath chainsVar blk =
modifyTVar chainsVar (Map.adjust (AF.addBlock (getHeader blk)) sockPath)


data ChairmanError blk =
Expand Down Expand Up @@ -267,12 +262,12 @@ rollback
( MonadSTM m
, HasHeader (Header blk)
)
=> CoreNodeId
=> SocketPath
-> ChainsVar m blk
-> Point blk
-> STM m ()
rollback coreNodeId chainsVar p =
modifyTVar chainsVar (Map.adjust fn coreNodeId)
rollback sockPath chainsVar p =
modifyTVar chainsVar (Map.adjust fn sockPath)
where
p' :: Point (Header blk)
p' = coerce p
Expand Down Expand Up @@ -302,12 +297,12 @@ chainSyncClient
, Condense (HeaderHash (Header blk))
)
=> Tracer m (ChairmanTrace blk)
-> CoreNodeId
-> SocketPath
-> ChainsVar m blk
-> SecurityParam
-> Maybe BlockNo
-> ChainSyncClient blk (Tip blk) m ()
chainSyncClient tracer coreNodeId chainsVar securityParam maxBlockNo = ChainSyncClient $ pure $
chainSyncClient tracer sockPath chainsVar securityParam maxBlockNo = ChainSyncClient $ pure $
-- Notify the core node about the our latest points at which we are
-- synchronised. This client is not persistent and thus it just
-- synchronises from the genesis block. A real implementation should send
Expand All @@ -334,15 +329,15 @@ chainSyncClient tracer coreNodeId chainsVar securityParam maxBlockNo = ChainSync
-- add block & check if there is consensus on immutable chain
-- trace the decision or error
res <- atomically $ do
addBlock coreNodeId chainsVar blk
addBlock sockPath chainsVar blk
checkConsensus chainsVar securityParam
traceWith tracer res
let currentBlockNo = Just (Block.blockNo blk)
pure $ clientStIdle currentBlockNo
, recvMsgRollBackward = \point _tip -> ChainSyncClient $ do
-- rollback & check
res <- atomically $ do
rollback coreNodeId chainsVar point
rollback sockPath chainsVar point
checkConsensus chainsVar securityParam
traceWith tracer res
pure $ clientStIdle Nothing
Expand All @@ -363,7 +358,7 @@ localInitiatorNetworkApplication
, MonadThrow m
, MonadThrow (STM m)
)
=> CoreNodeId
=> SocketPath
-> ChainsVar m blk
-> SecurityParam
-> Maybe BlockNo
Expand All @@ -380,7 +375,7 @@ localInitiatorNetworkApplication
-> Versions NodeToClientVersion DictVersion
(OuroborosApplication 'InitiatorApp peer NodeToClientProtocols
m ByteString () Void)
localInitiatorNetworkApplication coreNodeId chainsVar securityParam maxBlockNo chairmanTracer chainSyncTracer localTxSubmissionTracer pInfoConfig =
localInitiatorNetworkApplication sockPath chainsVar securityParam maxBlockNo chairmanTracer chainSyncTracer localTxSubmissionTracer pInfoConfig =
simpleSingletonVersions
NodeToClientV_1
(NodeToClientVersionData (nodeNetworkMagic (Proxy @blk) pInfoConfig))
Expand All @@ -399,7 +394,7 @@ localInitiatorNetworkApplication coreNodeId chainsVar securityParam maxBlockNo c
chainSyncTracer
(localChainSyncCodec pInfoConfig)
channel
(chainSyncClientPeer $ chainSyncClient chairmanTracer coreNodeId chainsVar securityParam maxBlockNo)
(chainSyncClientPeer $ chainSyncClient chairmanTracer sockPath chainsVar securityParam maxBlockNo)


--
Expand Down
15 changes: 9 additions & 6 deletions scripts/chairman.sh
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
#!/usr/bin/env bash
#
# ./scripts/chairman.sh ./socket/0 ./socket/1 ./socket/2

[ $# -ne 1 ] && echo "Usage: $(basename $0) TargetSocketFilePath" 1>&2 && exit 1

SOCKET=$1
# it does not make sense to run chairman just for a single node
[ $# -le 1 ] && echo "Usage: $(basename $0) TargetSocketFilePath" 1>&2 && exit 1

set -e

SOCKET_PATHS=${@/#/--socket-path }

. $(dirname $0)/lib-node.sh
CHAIRMAN="$(executable_runner chairman)"

set -x

${CHAIRMAN} \
--core-node-id 0 --core-node-id 1 --core-node-id 2 \
-k 10 -s 250 \
-t 1000 \
--genesis-file "${genesis_file}" \
--genesis-hash "${genesis_hash}" \
--socket-path "${1}" \
--config "${configuration}/log-config-0.yaml"
--config "${configuration}/log-config-0.yaml" \
$SOCKET_PATHS

0 comments on commit 6d6a9d6

Please sign in to comment.