fediChordInit returns a RealNode, manages vservers as map
- contributes to #34
This commit is contained in:
parent
9bf7365a2c
commit
12dfc56a73
|
@ -73,6 +73,8 @@ import Data.IP (IPv6, fromHostAddress6,
|
||||||
toHostAddress6)
|
toHostAddress6)
|
||||||
import Data.List ((\\))
|
import Data.List ((\\))
|
||||||
import qualified Data.Map.Strict as Map
|
import qualified Data.Map.Strict as Map
|
||||||
|
import qualified Data.HashMap.Strict as HMap
|
||||||
|
import Data.HashMap.Strict (HashMap)
|
||||||
import Data.Maybe (catMaybes, fromJust, fromMaybe,
|
import Data.Maybe (catMaybes, fromJust, fromMaybe,
|
||||||
isJust, isNothing, mapMaybe)
|
isJust, isNothing, mapMaybe)
|
||||||
import qualified Data.Set as Set
|
import qualified Data.Set as Set
|
||||||
|
@ -96,11 +98,11 @@ import Debug.Trace (trace)
|
||||||
fediChordInit :: (Service s (RealNodeSTM s))
|
fediChordInit :: (Service s (RealNodeSTM s))
|
||||||
=> FediChordConf
|
=> FediChordConf
|
||||||
-> (RealNodeSTM s -> IO (s (RealNodeSTM s))) -- ^ runner function for service
|
-> (RealNodeSTM s -> IO (s (RealNodeSTM s))) -- ^ runner function for service
|
||||||
-> IO (Socket, LocalNodeStateSTM s)
|
-> IO (Socket, RealNodeSTM s)
|
||||||
fediChordInit initConf serviceRunner = do
|
fediChordInit initConf serviceRunner = do
|
||||||
emptyLookupCache <- newTVarIO Map.empty
|
emptyLookupCache <- newTVarIO Map.empty
|
||||||
let realNode = RealNode {
|
let realNode = RealNode {
|
||||||
vservers = []
|
vservers = HMap.empty
|
||||||
, nodeConfig = initConf
|
, nodeConfig = initConf
|
||||||
, bootstrapNodes = confBootstrapNodes initConf
|
, bootstrapNodes = confBootstrapNodes initConf
|
||||||
, lookupCacheSTM = emptyLookupCache
|
, lookupCacheSTM = emptyLookupCache
|
||||||
|
@ -110,13 +112,13 @@ fediChordInit initConf serviceRunner = do
|
||||||
-- launch service and set the reference in the RealNode
|
-- launch service and set the reference in the RealNode
|
||||||
serv <- serviceRunner realNodeSTM
|
serv <- serviceRunner realNodeSTM
|
||||||
atomically . modifyTVar' realNodeSTM $ \rn -> rn { nodeService = serv }
|
atomically . modifyTVar' realNodeSTM $ \rn -> rn { nodeService = serv }
|
||||||
-- initialise a single vserver
|
-- TODO: k-choices way of joining, so far just initialise a single vserver
|
||||||
initialState <- nodeStateInit realNodeSTM
|
firstVS <- nodeStateInit realNodeSTM
|
||||||
initialStateSTM <- newTVarIO initialState
|
firstVSSTM <- newTVarIO firstVS
|
||||||
-- add vserver to list at RealNode
|
-- add vserver to list at RealNode
|
||||||
atomically . modifyTVar' realNodeSTM $ \rn -> rn { vservers = initialStateSTM:vservers rn }
|
atomically . modifyTVar' realNodeSTM $ \rn -> rn { vservers = HMap.insert (getNid firstVS) firstVSSTM (vservers rn) }
|
||||||
serverSock <- mkServerSocket (getIpAddr initialState) (getDhtPort initialState)
|
serverSock <- mkServerSocket (confIP initConf) (fromIntegral $ confDhtPort initConf)
|
||||||
pure (serverSock, initialStateSTM)
|
pure (serverSock, realNodeSTM)
|
||||||
|
|
||||||
-- | initialises the 'NodeState' for this local node.
|
-- | initialises the 'NodeState' for this local node.
|
||||||
-- Separated from 'fediChordInit' to be usable in tests.
|
-- Separated from 'fediChordInit' to be usable in tests.
|
||||||
|
@ -757,7 +759,7 @@ updateLookupCache :: RealNodeSTM s -> NodeID -> IO (Maybe (String, PortNumber))
|
||||||
updateLookupCache nodeSTM keyToLookup = do
|
updateLookupCache nodeSTM keyToLookup = do
|
||||||
(node, lookupSource) <- atomically $ do
|
(node, lookupSource) <- atomically $ do
|
||||||
node <- readTVar nodeSTM
|
node <- readTVar nodeSTM
|
||||||
let firstVs = headMay (vservers node)
|
let firstVs = headMay (HMap.elems $ vservers node)
|
||||||
lookupSource <- case firstVs of
|
lookupSource <- case firstVs of
|
||||||
Nothing -> pure Nothing
|
Nothing -> pure Nothing
|
||||||
Just vs -> Just <$> readTVar vs
|
Just vs -> Just <$> readTVar vs
|
||||||
|
|
|
@ -71,6 +71,8 @@ import Data.Function (on)
|
||||||
import qualified Data.Hashable as Hashable
|
import qualified Data.Hashable as Hashable
|
||||||
import Data.List (delete, nub, sortBy)
|
import Data.List (delete, nub, sortBy)
|
||||||
import qualified Data.Map.Strict as Map
|
import qualified Data.Map.Strict as Map
|
||||||
|
import Data.HashMap.Strict (HashMap)
|
||||||
|
import qualified Data.HashMap.Strict as HMap
|
||||||
import Data.Maybe (fromJust, fromMaybe, isJust,
|
import Data.Maybe (fromJust, fromMaybe, isJust,
|
||||||
isNothing, mapMaybe)
|
isNothing, mapMaybe)
|
||||||
import qualified Data.Set as Set
|
import qualified Data.Set as Set
|
||||||
|
@ -151,8 +153,8 @@ a `localCompare` b
|
||||||
-- Also contains shared data and config values.
|
-- Also contains shared data and config values.
|
||||||
-- TODO: more data structures for k-choices bookkeeping
|
-- TODO: more data structures for k-choices bookkeeping
|
||||||
data RealNode s = RealNode
|
data RealNode s = RealNode
|
||||||
{ vservers :: [LocalNodeStateSTM s]
|
{ vservers :: HashMap NodeID (LocalNodeStateSTM s)
|
||||||
-- ^ references to all active versers
|
-- ^ map of all active VServer node IDs to their node state
|
||||||
, nodeConfig :: FediChordConf
|
, nodeConfig :: FediChordConf
|
||||||
-- ^ holds the initial configuration read at program start
|
-- ^ holds the initial configuration read at program start
|
||||||
, bootstrapNodes :: [(String, PortNumber)]
|
, bootstrapNodes :: [(String, PortNumber)]
|
||||||
|
|
Loading…
Reference in a new issue