cache getClusters in Annex state

This commit is contained in:
Joey Hess 2024-06-14 11:16:01 -04:00
parent da3c0115cb
commit de1d795dfe
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
3 changed files with 14 additions and 6 deletions

View file

@ -74,6 +74,7 @@ import Types.CatFileHandles
import Types.RemoteConfig import Types.RemoteConfig
import Types.TransferrerPool import Types.TransferrerPool
import Types.VectorClock import Types.VectorClock
import Types.Cluster
import Annex.VectorClock.Utility import Annex.VectorClock.Utility
import Annex.Debug.Utility import Annex.Debug.Utility
import qualified Database.Keys.Handle as Keys import qualified Database.Keys.Handle as Keys
@ -194,6 +195,7 @@ data AnnexState = AnnexState
, preferredcontentmap :: Maybe (FileMatcherMap Annex) , preferredcontentmap :: Maybe (FileMatcherMap Annex)
, requiredcontentmap :: Maybe (FileMatcherMap Annex) , requiredcontentmap :: Maybe (FileMatcherMap Annex)
, remoteconfigmap :: Maybe (M.Map UUID RemoteConfig) , remoteconfigmap :: Maybe (M.Map UUID RemoteConfig)
, clusters :: Maybe Clusters
, forcetrust :: TrustMap , forcetrust :: TrustMap
, trustmap :: Maybe TrustMap , trustmap :: Maybe TrustMap
, groupmap :: Maybe GroupMap , groupmap :: Maybe GroupMap
@ -248,6 +250,7 @@ newAnnexState c r = do
, preferredcontentmap = Nothing , preferredcontentmap = Nothing
, requiredcontentmap = Nothing , requiredcontentmap = Nothing
, remoteconfigmap = Nothing , remoteconfigmap = Nothing
, clusters = Nothing
, forcetrust = M.empty , forcetrust = M.empty
, trustmap = Nothing , trustmap = Nothing
, groupmap = Nothing , groupmap = Nothing

View file

@ -30,15 +30,19 @@ import qualified Data.Attoparsec.ByteString as A
import qualified Data.Attoparsec.ByteString.Char8 as A8 import qualified Data.Attoparsec.ByteString.Char8 as A8
import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy as L
-- TODO caching
getClusters :: Annex Clusters getClusters :: Annex Clusters
getClusters = do getClusters = maybe loadClusters return =<< Annex.getState Annex.clusters
loadClusters :: Annex Clusters
loadClusters = do
m <- convclusteruuids . M.map value . fromMapLog . parseClusterLog m <- convclusteruuids . M.map value . fromMapLog . parseClusterLog
<$> Annex.Branch.get clusterLog <$> Annex.Branch.get clusterLog
return $ Clusters let clusters = Clusters
{ clusterUUIDs = m { clusterUUIDs = m
, clusterNodeUUIDs = M.foldlWithKey inverter mempty m , clusterNodeUUIDs = M.foldlWithKey inverter mempty m
} }
Annex.changeState $ \s -> s { Annex.clusters = Just clusters }
return clusters
where where
convclusteruuids :: M.Map UUID (S.Set ClusterNodeUUID) -> M.Map ClusterUUID (S.Set ClusterNodeUUID) convclusteruuids :: M.Map UUID (S.Set ClusterNodeUUID) -> M.Map ClusterUUID (S.Set ClusterNodeUUID)
convclusteruuids = M.fromList convclusteruuids = M.fromList

View file

@ -218,9 +218,10 @@ UUID, all random except the first octet set to 'a' and the second to 'c'.
The proxy log contains the cluster UUID (with a remote name like The proxy log contains the cluster UUID (with a remote name like
"cluster"), as well as the UUIDs of the nodes of the cluster. "cluster"), as well as the UUIDs of the nodes of the cluster.
This makes the client access the cluster using the proxy. Note that more This lets the client access the cluster using the proxy, and it lets the
than one proxy can be in front of the same cluster, and multiple clusters client access individual nodes (so it can lock content on them while
can be accessed via the same proxy. dropping). Note that more than one proxy can be in front of the same
cluster, and multiple clusters can be accessed via the same proxy.
The cluster UUID is recorded in the git-annex branch, along with a list of The cluster UUID is recorded in the git-annex branch, along with a list of
the UUIDs of nodes of the cluster (which can change at any time). the UUIDs of nodes of the cluster (which can change at any time).