module Ecluse.Core.Server.Cache (
CacheConfig (..),
StoreBudget (..),
MetadataCache,
newMetadataCache,
Source (..),
CacheEntry (..),
weighCacheEntry,
resolveMetadata,
resolveMetadataWith,
cachedMetadata,
resolveVersion,
resolveVersionWith,
cachedVersion,
resolveAssembled,
) where
import Data.ByteString qualified as BS
import Data.Text.Short qualified as TS
import Data.Time (NominalDiffTime)
import Ecluse.Core.Package (
PackageDetails,
PackageInfo,
PackageName,
pkgCanonical,
pkgEcosystem,
pkgNamespace,
renderScope,
)
import Ecluse.Core.Registry.CachedDocument (CachedDoc, weighCachedDoc)
import Ecluse.Core.Registry.Metadata (ContentDigest, MetadataError)
import Ecluse.Core.Server.Cache.Store (
CacheOccupancy (..),
SingleFlight,
lookupStore,
lookupStoreTouching,
newSingleFlight,
resolveSingleFlight,
)
import Ecluse.Core.Server.MemoryModel (expandWireBytes)
import Ecluse.Core.Telemetry.Record (
MetricsPort,
mpAssembledCacheResidentBytes,
mpCacheEntries,
mpCacheRequest,
mpCacheResidentBytes,
mpVersionCacheResidentBytes,
)
import Ecluse.Core.Version (Version, renderVersion)
data StoreBudget = StoreBudget
{ StoreBudget -> Int
sbMaxEntries :: Int
, StoreBudget -> Int
sbMaxBytes :: Int
}
deriving stock (StoreBudget -> StoreBudget -> Bool
(StoreBudget -> StoreBudget -> Bool)
-> (StoreBudget -> StoreBudget -> Bool) -> Eq StoreBudget
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: StoreBudget -> StoreBudget -> Bool
== :: StoreBudget -> StoreBudget -> Bool
$c/= :: StoreBudget -> StoreBudget -> Bool
/= :: StoreBudget -> StoreBudget -> Bool
Eq, Int -> StoreBudget -> ShowS
[StoreBudget] -> ShowS
StoreBudget -> String
(Int -> StoreBudget -> ShowS)
-> (StoreBudget -> String)
-> ([StoreBudget] -> ShowS)
-> Show StoreBudget
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> StoreBudget -> ShowS
showsPrec :: Int -> StoreBudget -> ShowS
$cshow :: StoreBudget -> String
show :: StoreBudget -> String
$cshowList :: [StoreBudget] -> ShowS
showList :: [StoreBudget] -> ShowS
Show)
data CacheConfig = CacheConfig
{ CacheConfig -> NominalDiffTime
cacheTtl :: NominalDiffTime
, CacheConfig -> StoreBudget
cacheFullBudget :: StoreBudget
, CacheConfig -> StoreBudget
cacheVersionBudget :: StoreBudget
, CacheConfig -> StoreBudget
cacheAssembledBudget :: StoreBudget
}
deriving stock (CacheConfig -> CacheConfig -> Bool
(CacheConfig -> CacheConfig -> Bool)
-> (CacheConfig -> CacheConfig -> Bool) -> Eq CacheConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CacheConfig -> CacheConfig -> Bool
== :: CacheConfig -> CacheConfig -> Bool
$c/= :: CacheConfig -> CacheConfig -> Bool
/= :: CacheConfig -> CacheConfig -> Bool
Eq, Int -> CacheConfig -> ShowS
[CacheConfig] -> ShowS
CacheConfig -> String
(Int -> CacheConfig -> ShowS)
-> (CacheConfig -> String)
-> ([CacheConfig] -> ShowS)
-> Show CacheConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CacheConfig -> ShowS
showsPrec :: Int -> CacheConfig -> ShowS
$cshow :: CacheConfig -> String
show :: CacheConfig -> String
$cshowList :: [CacheConfig] -> ShowS
showList :: [CacheConfig] -> ShowS
Show)
newtype Source = Source Text
deriving stock (Source -> Source -> Bool
(Source -> Source -> Bool)
-> (Source -> Source -> Bool) -> Eq Source
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Source -> Source -> Bool
== :: Source -> Source -> Bool
$c/= :: Source -> Source -> Bool
/= :: Source -> Source -> Bool
Eq, Eq Source
Eq Source =>
(Source -> Source -> Ordering)
-> (Source -> Source -> Bool)
-> (Source -> Source -> Bool)
-> (Source -> Source -> Bool)
-> (Source -> Source -> Bool)
-> (Source -> Source -> Source)
-> (Source -> Source -> Source)
-> Ord Source
Source -> Source -> Bool
Source -> Source -> Ordering
Source -> Source -> Source
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Source -> Source -> Ordering
compare :: Source -> Source -> Ordering
$c< :: Source -> Source -> Bool
< :: Source -> Source -> Bool
$c<= :: Source -> Source -> Bool
<= :: Source -> Source -> Bool
$c> :: Source -> Source -> Bool
> :: Source -> Source -> Bool
$c>= :: Source -> Source -> Bool
>= :: Source -> Source -> Bool
$cmax :: Source -> Source -> Source
max :: Source -> Source -> Source
$cmin :: Source -> Source -> Source
min :: Source -> Source -> Source
Ord, Int -> Source -> ShowS
[Source] -> ShowS
Source -> String
(Int -> Source -> ShowS)
-> (Source -> String) -> ([Source] -> ShowS) -> Show Source
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Source -> ShowS
showsPrec :: Int -> Source -> ShowS
$cshow :: Source -> String
show :: Source -> String
$cshowList :: [Source] -> ShowS
showList :: [Source] -> ShowS
Show)
data CacheEntry = CacheEntry
{ CacheEntry -> PackageInfo
entryInfo :: PackageInfo
, CacheEntry -> CachedDoc
entryRaw :: CachedDoc
, CacheEntry -> ContentDigest
entryDigest :: ContentDigest
}
deriving stock (CacheEntry -> CacheEntry -> Bool
(CacheEntry -> CacheEntry -> Bool)
-> (CacheEntry -> CacheEntry -> Bool) -> Eq CacheEntry
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CacheEntry -> CacheEntry -> Bool
== :: CacheEntry -> CacheEntry -> Bool
$c/= :: CacheEntry -> CacheEntry -> Bool
/= :: CacheEntry -> CacheEntry -> Bool
Eq, Int -> CacheEntry -> ShowS
[CacheEntry] -> ShowS
CacheEntry -> String
(Int -> CacheEntry -> ShowS)
-> (CacheEntry -> String)
-> ([CacheEntry] -> ShowS)
-> Show CacheEntry
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CacheEntry -> ShowS
showsPrec :: Int -> CacheEntry -> ShowS
$cshow :: CacheEntry -> String
show :: CacheEntry -> String
$cshowList :: [CacheEntry] -> ShowS
showList :: [CacheEntry] -> ShowS
Show)
weighCacheEntry :: CacheEntry -> Int
weighCacheEntry :: CacheEntry -> Int
weighCacheEntry CacheEntry
e = Int64 -> Int
weighEncodedBytes (CachedDoc -> Int64
weighCachedDoc (CacheEntry -> CachedDoc
entryRaw CacheEntry
e))
weighVersion :: Maybe PackageDetails -> Int
weighVersion :: Maybe PackageDetails -> Int
weighVersion = \case
Just PackageDetails
_ -> Int
versionEntryBytes
Maybe PackageDetails
Nothing -> Int
negativeEntryBytes
weighEncodedBytes :: Int64 -> Int
weighEncodedBytes :: Int64 -> Int
weighEncodedBytes = Int -> Int
expandWireBytes (Int -> Int) -> (Int64 -> Int) -> Int64 -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral
versionEntryBytes :: Int
versionEntryBytes :: Int
versionEntryBytes = Int
16 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
1024
negativeEntryBytes :: Int
negativeEntryBytes :: Int
negativeEntryBytes = Int
1024
weighAssembled :: ByteString -> Int
weighAssembled :: ByteString -> Int
weighAssembled ByteString
bytes = ByteString -> Int
BS.length ByteString
bytes Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
assembledEntryOverheadBytes
assembledEntryOverheadBytes :: Int
assembledEntryOverheadBytes :: Int
assembledEntryOverheadBytes = Int
256
newtype CacheKey = CacheKey Text
deriving stock (CacheKey -> CacheKey -> Bool
(CacheKey -> CacheKey -> Bool)
-> (CacheKey -> CacheKey -> Bool) -> Eq CacheKey
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CacheKey -> CacheKey -> Bool
== :: CacheKey -> CacheKey -> Bool
$c/= :: CacheKey -> CacheKey -> Bool
/= :: CacheKey -> CacheKey -> Bool
Eq, Eq CacheKey
Eq CacheKey =>
(CacheKey -> CacheKey -> Ordering)
-> (CacheKey -> CacheKey -> Bool)
-> (CacheKey -> CacheKey -> Bool)
-> (CacheKey -> CacheKey -> Bool)
-> (CacheKey -> CacheKey -> Bool)
-> (CacheKey -> CacheKey -> CacheKey)
-> (CacheKey -> CacheKey -> CacheKey)
-> Ord CacheKey
CacheKey -> CacheKey -> Bool
CacheKey -> CacheKey -> Ordering
CacheKey -> CacheKey -> CacheKey
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: CacheKey -> CacheKey -> Ordering
compare :: CacheKey -> CacheKey -> Ordering
$c< :: CacheKey -> CacheKey -> Bool
< :: CacheKey -> CacheKey -> Bool
$c<= :: CacheKey -> CacheKey -> Bool
<= :: CacheKey -> CacheKey -> Bool
$c> :: CacheKey -> CacheKey -> Bool
> :: CacheKey -> CacheKey -> Bool
$c>= :: CacheKey -> CacheKey -> Bool
>= :: CacheKey -> CacheKey -> Bool
$cmax :: CacheKey -> CacheKey -> CacheKey
max :: CacheKey -> CacheKey -> CacheKey
$cmin :: CacheKey -> CacheKey -> CacheKey
min :: CacheKey -> CacheKey -> CacheKey
Ord, Int -> CacheKey -> ShowS
[CacheKey] -> ShowS
CacheKey -> String
(Int -> CacheKey -> ShowS)
-> (CacheKey -> String) -> ([CacheKey] -> ShowS) -> Show CacheKey
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CacheKey -> ShowS
showsPrec :: Int -> CacheKey -> ShowS
$cshow :: CacheKey -> String
show :: CacheKey -> String
$cshowList :: [CacheKey] -> ShowS
showList :: [CacheKey] -> ShowS
Show)
deriving newtype (Eq CacheKey
Eq CacheKey =>
(Int -> CacheKey -> Int) -> (CacheKey -> Int) -> Hashable CacheKey
Int -> CacheKey -> Int
CacheKey -> Int
forall a. Eq a => (Int -> a -> Int) -> (a -> Int) -> Hashable a
$chashWithSalt :: Int -> CacheKey -> Int
hashWithSalt :: Int -> CacheKey -> Int
$chash :: CacheKey -> Int
hash :: CacheKey -> Int
Hashable)
keyText :: Source -> PackageName -> Text
keyText :: Source -> PackageName -> Text
keyText (Source Text
source) PackageName
name =
Text
source
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\x1f"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Ecosystem -> Text
forall b a. (Show a, IsString b) => a -> b
show (PackageName -> Ecosystem
pkgEcosystem PackageName
name)
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\x1f"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> (Scope -> Text) -> Maybe Scope -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
"" Scope -> Text
renderScope (PackageName -> Maybe Scope
pkgNamespace PackageName
name)
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\x1f"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ShortText -> Text
TS.toText (PackageName -> ShortText
pkgCanonical PackageName
name)
cacheKey :: Source -> PackageName -> CacheKey
cacheKey :: Source -> PackageName -> CacheKey
cacheKey Source
source PackageName
name = Text -> CacheKey
CacheKey (Source -> PackageName -> Text
keyText Source
source PackageName
name)
newtype VersionKey = VersionKey Text
deriving stock (VersionKey -> VersionKey -> Bool
(VersionKey -> VersionKey -> Bool)
-> (VersionKey -> VersionKey -> Bool) -> Eq VersionKey
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: VersionKey -> VersionKey -> Bool
== :: VersionKey -> VersionKey -> Bool
$c/= :: VersionKey -> VersionKey -> Bool
/= :: VersionKey -> VersionKey -> Bool
Eq, Eq VersionKey
Eq VersionKey =>
(VersionKey -> VersionKey -> Ordering)
-> (VersionKey -> VersionKey -> Bool)
-> (VersionKey -> VersionKey -> Bool)
-> (VersionKey -> VersionKey -> Bool)
-> (VersionKey -> VersionKey -> Bool)
-> (VersionKey -> VersionKey -> VersionKey)
-> (VersionKey -> VersionKey -> VersionKey)
-> Ord VersionKey
VersionKey -> VersionKey -> Bool
VersionKey -> VersionKey -> Ordering
VersionKey -> VersionKey -> VersionKey
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: VersionKey -> VersionKey -> Ordering
compare :: VersionKey -> VersionKey -> Ordering
$c< :: VersionKey -> VersionKey -> Bool
< :: VersionKey -> VersionKey -> Bool
$c<= :: VersionKey -> VersionKey -> Bool
<= :: VersionKey -> VersionKey -> Bool
$c> :: VersionKey -> VersionKey -> Bool
> :: VersionKey -> VersionKey -> Bool
$c>= :: VersionKey -> VersionKey -> Bool
>= :: VersionKey -> VersionKey -> Bool
$cmax :: VersionKey -> VersionKey -> VersionKey
max :: VersionKey -> VersionKey -> VersionKey
$cmin :: VersionKey -> VersionKey -> VersionKey
min :: VersionKey -> VersionKey -> VersionKey
Ord, Int -> VersionKey -> ShowS
[VersionKey] -> ShowS
VersionKey -> String
(Int -> VersionKey -> ShowS)
-> (VersionKey -> String)
-> ([VersionKey] -> ShowS)
-> Show VersionKey
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> VersionKey -> ShowS
showsPrec :: Int -> VersionKey -> ShowS
$cshow :: VersionKey -> String
show :: VersionKey -> String
$cshowList :: [VersionKey] -> ShowS
showList :: [VersionKey] -> ShowS
Show)
deriving newtype (Eq VersionKey
Eq VersionKey =>
(Int -> VersionKey -> Int)
-> (VersionKey -> Int) -> Hashable VersionKey
Int -> VersionKey -> Int
VersionKey -> Int
forall a. Eq a => (Int -> a -> Int) -> (a -> Int) -> Hashable a
$chashWithSalt :: Int -> VersionKey -> Int
hashWithSalt :: Int -> VersionKey -> Int
$chash :: VersionKey -> Int
hash :: VersionKey -> Int
Hashable)
versionKey :: Source -> PackageName -> Version -> VersionKey
versionKey :: Source -> PackageName -> Version -> VersionKey
versionKey Source
source PackageName
name Version
version = Text -> VersionKey
VersionKey (Source -> PackageName -> Text
keyText Source
source PackageName
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\x1f" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Version -> Text
renderVersion Version
version)
data MetadataCache = MetadataCache
{ MetadataCache -> SingleFlight MetadataError CacheKey CacheEntry
mcFull :: SingleFlight MetadataError CacheKey CacheEntry
, MetadataCache
-> SingleFlight MetadataError VersionKey (Maybe PackageDetails)
mcVersion :: SingleFlight MetadataError VersionKey (Maybe PackageDetails)
, MetadataCache -> SingleFlight Void Text ByteString
mcAssembled :: SingleFlight Void Text ByteString
}
newMetadataCache :: CacheConfig -> IO MetadataCache
newMetadataCache :: CacheConfig -> IO MetadataCache
newMetadataCache CacheConfig
cfg =
SingleFlight MetadataError CacheKey CacheEntry
-> SingleFlight MetadataError VersionKey (Maybe PackageDetails)
-> SingleFlight Void Text ByteString
-> MetadataCache
MetadataCache
(SingleFlight MetadataError CacheKey CacheEntry
-> SingleFlight MetadataError VersionKey (Maybe PackageDetails)
-> SingleFlight Void Text ByteString
-> MetadataCache)
-> IO (SingleFlight MetadataError CacheKey CacheEntry)
-> IO
(SingleFlight MetadataError VersionKey (Maybe PackageDetails)
-> SingleFlight Void Text ByteString -> MetadataCache)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StoreBudget
-> (CacheEntry -> Int)
-> IO (SingleFlight MetadataError CacheKey CacheEntry)
forall v e k. StoreBudget -> (v -> Int) -> IO (SingleFlight e k v)
newStore (CacheConfig -> StoreBudget
cacheFullBudget CacheConfig
cfg) CacheEntry -> Int
weighCacheEntry
IO
(SingleFlight MetadataError VersionKey (Maybe PackageDetails)
-> SingleFlight Void Text ByteString -> MetadataCache)
-> IO
(SingleFlight MetadataError VersionKey (Maybe PackageDetails))
-> IO (SingleFlight Void Text ByteString -> MetadataCache)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StoreBudget
-> (Maybe PackageDetails -> Int)
-> IO
(SingleFlight MetadataError VersionKey (Maybe PackageDetails))
forall v e k. StoreBudget -> (v -> Int) -> IO (SingleFlight e k v)
newStore (CacheConfig -> StoreBudget
cacheVersionBudget CacheConfig
cfg) Maybe PackageDetails -> Int
weighVersion
IO (SingleFlight Void Text ByteString -> MetadataCache)
-> IO (SingleFlight Void Text ByteString) -> IO MetadataCache
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StoreBudget
-> (ByteString -> Int) -> IO (SingleFlight Void Text ByteString)
forall v e k. StoreBudget -> (v -> Int) -> IO (SingleFlight e k v)
newStore (CacheConfig -> StoreBudget
cacheAssembledBudget CacheConfig
cfg) ByteString -> Int
weighAssembled
where
newStore :: StoreBudget -> (v -> Int) -> IO (SingleFlight e k v)
newStore :: forall v e k. StoreBudget -> (v -> Int) -> IO (SingleFlight e k v)
newStore StoreBudget
budget = NominalDiffTime
-> Int -> Int -> (v -> Int) -> IO (SingleFlight e k v)
forall v e k.
NominalDiffTime
-> Int -> Int -> (v -> Int) -> IO (SingleFlight e k v)
newSingleFlight (CacheConfig -> NominalDiffTime
cacheTtl CacheConfig
cfg) (StoreBudget -> Int
sbMaxEntries StoreBudget
budget) (StoreBudget -> Int
sbMaxBytes StoreBudget
budget)
resolveMetadata :: MetricsPort -> MetadataCache -> Source -> PackageName -> IO (Either MetadataError CacheEntry) -> IO (Either MetadataError CacheEntry)
resolveMetadata :: MetricsPort
-> MetadataCache
-> Source
-> PackageName
-> IO (Either MetadataError CacheEntry)
-> IO (Either MetadataError CacheEntry)
resolveMetadata = IO ()
-> MetricsPort
-> MetadataCache
-> Source
-> PackageName
-> IO (Either MetadataError CacheEntry)
-> IO (Either MetadataError CacheEntry)
resolveMetadataWith (() -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
resolveMetadataWith :: IO () -> MetricsPort -> MetadataCache -> Source -> PackageName -> IO (Either MetadataError CacheEntry) -> IO (Either MetadataError CacheEntry)
resolveMetadataWith :: IO ()
-> MetricsPort
-> MetadataCache
-> Source
-> PackageName
-> IO (Either MetadataError CacheEntry)
-> IO (Either MetadataError CacheEntry)
resolveMetadataWith IO ()
afterClaim MetricsPort
metrics MetadataCache
cache Source
source PackageName
name =
IO ()
-> (CacheResult -> IO ())
-> (CacheOccupancy -> IO ())
-> SingleFlight MetadataError CacheKey CacheEntry
-> CacheKey
-> IO (Either MetadataError CacheEntry)
-> IO (Either MetadataError CacheEntry)
forall k e v.
(Hashable k, Ord k) =>
IO ()
-> (CacheResult -> IO ())
-> (CacheOccupancy -> IO ())
-> SingleFlight e k v
-> k
-> IO (Either e v)
-> IO (Either e v)
resolveSingleFlight
IO ()
afterClaim
(MetricsPort -> CacheResult -> IO ()
mpCacheRequest MetricsPort
metrics)
( \CacheOccupancy
occ -> do
MetricsPort -> Int -> IO ()
mpCacheEntries MetricsPort
metrics (CacheOccupancy -> Int
occEntries CacheOccupancy
occ)
MetricsPort -> Int -> IO ()
mpCacheResidentBytes MetricsPort
metrics (CacheOccupancy -> Int
occBytes CacheOccupancy
occ)
)
(MetadataCache -> SingleFlight MetadataError CacheKey CacheEntry
mcFull MetadataCache
cache)
(Source -> PackageName -> CacheKey
cacheKey Source
source PackageName
name)
resolveVersion :: MetricsPort -> MetadataCache -> Source -> PackageName -> Version -> IO (Either MetadataError (Maybe PackageDetails)) -> IO (Either MetadataError (Maybe PackageDetails))
resolveVersion :: MetricsPort
-> MetadataCache
-> Source
-> PackageName
-> Version
-> IO (Either MetadataError (Maybe PackageDetails))
-> IO (Either MetadataError (Maybe PackageDetails))
resolveVersion = IO ()
-> MetricsPort
-> MetadataCache
-> Source
-> PackageName
-> Version
-> IO (Either MetadataError (Maybe PackageDetails))
-> IO (Either MetadataError (Maybe PackageDetails))
resolveVersionWith (() -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
resolveVersionWith :: IO () -> MetricsPort -> MetadataCache -> Source -> PackageName -> Version -> IO (Either MetadataError (Maybe PackageDetails)) -> IO (Either MetadataError (Maybe PackageDetails))
resolveVersionWith :: IO ()
-> MetricsPort
-> MetadataCache
-> Source
-> PackageName
-> Version
-> IO (Either MetadataError (Maybe PackageDetails))
-> IO (Either MetadataError (Maybe PackageDetails))
resolveVersionWith IO ()
afterClaim MetricsPort
metrics MetadataCache
cache Source
source PackageName
name Version
version =
IO ()
-> (CacheResult -> IO ())
-> (CacheOccupancy -> IO ())
-> SingleFlight MetadataError VersionKey (Maybe PackageDetails)
-> VersionKey
-> IO (Either MetadataError (Maybe PackageDetails))
-> IO (Either MetadataError (Maybe PackageDetails))
forall k e v.
(Hashable k, Ord k) =>
IO ()
-> (CacheResult -> IO ())
-> (CacheOccupancy -> IO ())
-> SingleFlight e k v
-> k
-> IO (Either e v)
-> IO (Either e v)
resolveSingleFlight
IO ()
afterClaim
(IO () -> CacheResult -> IO ()
forall a b. a -> b -> a
const IO ()
forall (f :: * -> *). Applicative f => f ()
pass)
(MetricsPort -> Int -> IO ()
mpVersionCacheResidentBytes MetricsPort
metrics (Int -> IO ())
-> (CacheOccupancy -> Int) -> CacheOccupancy -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CacheOccupancy -> Int
occBytes)
(MetadataCache
-> SingleFlight MetadataError VersionKey (Maybe PackageDetails)
mcVersion MetadataCache
cache)
(Source -> PackageName -> Version -> VersionKey
versionKey Source
source PackageName
name Version
version)
resolveAssembled :: MetricsPort -> MetadataCache -> Text -> IO ByteString -> IO ByteString
resolveAssembled :: MetricsPort
-> MetadataCache -> Text -> IO ByteString -> IO ByteString
resolveAssembled MetricsPort
metrics MetadataCache
cache Text
key IO ByteString
render =
(Void -> ByteString)
-> (ByteString -> ByteString)
-> Either Void ByteString
-> ByteString
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Void -> ByteString
forall a. Void -> a
absurd ByteString -> ByteString
forall a. a -> a
id
(Either Void ByteString -> ByteString)
-> IO (Either Void ByteString) -> IO ByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO ()
-> (CacheResult -> IO ())
-> (CacheOccupancy -> IO ())
-> SingleFlight Void Text ByteString
-> Text
-> IO (Either Void ByteString)
-> IO (Either Void ByteString)
forall k e v.
(Hashable k, Ord k) =>
IO ()
-> (CacheResult -> IO ())
-> (CacheOccupancy -> IO ())
-> SingleFlight e k v
-> k
-> IO (Either e v)
-> IO (Either e v)
resolveSingleFlight
(() -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
(IO () -> CacheResult -> IO ()
forall a b. a -> b -> a
const IO ()
forall (f :: * -> *). Applicative f => f ()
pass)
(MetricsPort -> Int -> IO ()
mpAssembledCacheResidentBytes MetricsPort
metrics (Int -> IO ())
-> (CacheOccupancy -> Int) -> CacheOccupancy -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CacheOccupancy -> Int
occBytes)
(MetadataCache -> SingleFlight Void Text ByteString
mcAssembled MetadataCache
cache)
Text
key
(ByteString -> Either Void ByteString
forall a b. b -> Either a b
Right (ByteString -> Either Void ByteString)
-> IO ByteString -> IO (Either Void ByteString)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO ByteString
render)
cachedMetadata :: MetadataCache -> Source -> PackageName -> IO (Maybe CacheEntry)
cachedMetadata :: MetadataCache -> Source -> PackageName -> IO (Maybe CacheEntry)
cachedMetadata MetadataCache
cache Source
source PackageName
name = SingleFlight MetadataError CacheKey CacheEntry
-> CacheKey -> IO (Maybe CacheEntry)
forall k e v. Hashable k => SingleFlight e k v -> k -> IO (Maybe v)
lookupStore (MetadataCache -> SingleFlight MetadataError CacheKey CacheEntry
mcFull MetadataCache
cache) (Source -> PackageName -> CacheKey
cacheKey Source
source PackageName
name)
cachedVersion :: MetadataCache -> Source -> PackageName -> Version -> IO (Maybe (Maybe PackageDetails))
cachedVersion :: MetadataCache
-> Source
-> PackageName
-> Version
-> IO (Maybe (Maybe PackageDetails))
cachedVersion MetadataCache
cache Source
source PackageName
name Version
version = SingleFlight MetadataError VersionKey (Maybe PackageDetails)
-> VersionKey -> IO (Maybe (Maybe PackageDetails))
forall k e v. Hashable k => SingleFlight e k v -> k -> IO (Maybe v)
lookupStoreTouching (MetadataCache
-> SingleFlight MetadataError VersionKey (Maybe PackageDetails)
mcVersion MetadataCache
cache) (Source -> PackageName -> Version -> VersionKey
versionKey Source
source PackageName
name Version
version)