@@ -83,106 +83,139 @@ getCacheStatistics cs =
83
83
84
84
queryOrInsertRewardAccount ::
85
85
(MonadBaseControl IO m , MonadIO m ) =>
86
+ Trace IO Text ->
86
87
CacheStatus ->
87
88
CacheUpdateAction ->
88
89
Ledger. RewardAccount StandardCrypto ->
89
90
ReaderT SqlBackend m DB. StakeAddressId
90
- queryOrInsertRewardAccount cacheStatus cacheUA rewardAddr = do
91
- eiAddrId <- queryRewardAccountWithCacheRetBs cacheStatus cacheUA rewardAddr
91
+ queryOrInsertRewardAccount trce cacheStatus cacheUA rewardAddr = do
92
+ eiAddrId <- queryRewardAccountWithCacheRetBs trce cacheStatus rewardAddr
92
93
case eiAddrId of
93
- Left (_err, bs) -> insertStakeAddress rewardAddr (Just bs)
94
+ Left (_err, bs) -> insertStakeAddress cacheStatus rewardAddr (Just bs)
94
95
Right addrId -> pure addrId
95
96
96
97
queryOrInsertStakeAddress ::
97
98
(MonadBaseControl IO m , MonadIO m ) =>
99
+ Trace IO Text ->
98
100
CacheStatus ->
99
101
CacheUpdateAction ->
100
102
Network ->
101
103
StakeCred ->
102
104
ReaderT SqlBackend m DB. StakeAddressId
103
- queryOrInsertStakeAddress cacheStatus cacheUA nw cred =
104
- queryOrInsertRewardAccount cacheStatus cacheUA $ Ledger. RewardAccount nw cred
105
+ queryOrInsertStakeAddress trce cacheStatus cacheUA nw cred =
106
+ queryOrInsertRewardAccount trce cacheStatus cacheUA $ Ledger. RewardAccount nw cred
105
107
106
108
-- If the address already exists in the table, it will not be inserted again (due to
107
109
-- the uniqueness constraint) but the function will return the 'StakeAddressId'.
108
110
insertStakeAddress ::
109
111
(MonadBaseControl IO m , MonadIO m ) =>
112
+ CacheStatus ->
110
113
Ledger. RewardAccount StandardCrypto ->
111
114
Maybe ByteString ->
112
115
ReaderT SqlBackend m DB. StakeAddressId
113
- insertStakeAddress rewardAddr stakeCredBs =
114
- DB. insertStakeAddress $
115
- DB. StakeAddress
116
- { DB. stakeAddressHashRaw = addrBs
117
- , DB. stakeAddressView = Generic. renderRewardAccount rewardAddr
118
- , DB. stakeAddressScriptHash = Generic. getCredentialScriptHash $ Ledger. raCredential rewardAddr
119
- }
116
+ insertStakeAddress cacheStatus rewardAddr stakeCredBs = do
117
+ addrId <- DB. insertStakeAddress $
118
+ DB. StakeAddress
119
+ { DB. stakeAddressHashRaw = addrBs
120
+ , DB. stakeAddressView = Generic. renderRewardAccount rewardAddr
121
+ , DB. stakeAddressScriptHash = Generic. getCredentialScriptHash $ Ledger. raCredential rewardAddr
122
+ }
123
+ case cacheStatus of
124
+ NoCache -> pure addrId
125
+ CacheActive ci -> do
126
+ liftIO $ atomically $ modifyTVar (cStakeRawHashes ci) $
127
+ LRU. insert addrBs addrId
128
+ pure addrId
120
129
where
121
130
addrBs = fromMaybe (Ledger. serialiseRewardAccount rewardAddr) stakeCredBs
122
131
123
132
queryRewardAccountWithCacheRetBs ::
124
133
forall m .
125
134
MonadIO m =>
135
+ Trace IO Text ->
126
136
CacheStatus ->
127
137
CacheUpdateAction ->
128
138
Ledger. RewardAccount StandardCrypto ->
129
139
ReaderT SqlBackend m (Either (DB. LookupFail , ByteString ) DB. StakeAddressId )
130
- queryRewardAccountWithCacheRetBs cacheStatus cacheUA rwdAcc =
131
- queryStakeAddrWithCacheRetBs cacheStatus cacheUA (Ledger. raNetwork rwdAcc) (Ledger. raCredential rwdAcc)
140
+ queryRewardAccountWithCacheRetBs trce cacheStatus cacheUA rwdAcc =
141
+ queryStakeAddrWithCacheRetBs trce cacheStatus cacheUA (Ledger. raNetwork rwdAcc) (Ledger. raCredential rwdAcc)
132
142
133
143
queryStakeAddrWithCache ::
134
144
forall m .
135
145
MonadIO m =>
146
+ Trace IO Text ->
136
147
CacheStatus ->
137
148
CacheUpdateAction ->
138
149
Network ->
139
150
StakeCred ->
140
151
ReaderT SqlBackend m (Either DB. LookupFail DB. StakeAddressId )
141
- queryStakeAddrWithCache cacheStatus cacheUA nw cred =
142
- mapLeft fst <$> queryStakeAddrWithCacheRetBs cacheStatus cacheUA nw cred
152
+ queryStakeAddrWithCache trce cacheStatus cacheUA nw cred =
153
+ mapLeft fst <$> queryStakeAddrWithCacheRetBs trce cacheStatus cacheUA nw cred
143
154
144
155
queryStakeAddrWithCacheRetBs ::
145
156
forall m .
146
157
MonadIO m =>
158
+ Trace IO Text ->
147
159
CacheStatus ->
148
160
CacheUpdateAction ->
149
161
Network ->
150
162
StakeCred ->
151
163
ReaderT SqlBackend m (Either (DB. LookupFail , ByteString ) DB. StakeAddressId )
152
- queryStakeAddrWithCacheRetBs cacheStatus cacheUA nw cred = do
164
+ queryStakeAddrWithCacheRetBs trce cacheStatus cacheUA nw cred = do
165
+ let ! bs = Ledger. serialiseRewardAccount (Ledger. RewardAccount nw cred)
153
166
case cacheStatus of
154
167
NoCache -> do
155
- let ! bs = Ledger. serialiseRewardAccount (Ledger. RewardAccount nw cred)
156
168
mapLeft (,bs) <$> queryStakeAddress bs
157
- ActiveCache ci -> do
158
- mp <- liftIO $ readTVarIO (cStakeCreds ci)
159
- (mAddrId, mp') <- queryStakeAddrAux cacheUA mp (cStats ci) nw cred
160
- liftIO $ atomically $ writeTVar (cStakeCreds ci) mp'
161
- pure mAddrId
169
+ CacheActive ci -> do
170
+ currentCache <- liftIO $ readTVarIO (cStakeRawHashes ci)
171
+ let cacheSize = LRU. getSize currentCache
172
+ newCache <-
173
+ if cacheSize < 1
174
+ then do
175
+ liftIO $ logInfo trce " ----------------- Cache is empty. Querying all addresses. ---------"
176
+ queryRes <- DB. queryLatestAddresses cacheSize
177
+ pure $ LRU. fromList queryRes currentCache
178
+ -- convert the results into the cache
179
+ else pure currentCache
180
+ case LRU. lookup bs newCache of
181
+ Just (addrId, mp') -> do
182
+ liftIO $ hitCreds (cStats ci)
183
+ liftIO $ atomically $ writeTVar (cStakeRawHashes ci) mp'
184
+ pure $ Right addrId
185
+ Nothing -> do
186
+ liftIO $ missCreds (cStats ci)
187
+ liftIO $ atomically $ writeTVar (cStakeRawHashes ci) newCache
188
+ queryRes <- mapLeft (,bs) <$> queryStakeAddress bs
189
+ case queryRes of
190
+ Left _ -> pure queryRes
191
+ Right stakeAddrsId -> do
192
+ liftIO $ atomically $ modifyTVar (cStakeRawHashes ci) $
193
+ LRU. insert bs stakeAddrsId
194
+ pure $ Right stakeAddrsId
162
195
163
- queryStakeAddrAux ::
164
- MonadIO m =>
165
- CacheUpdateAction ->
166
- StakeAddrCache ->
167
- StrictTVar IO CacheStatistics ->
168
- Network ->
169
- StakeCred ->
170
- ReaderT SqlBackend m (Either (DB. LookupFail , ByteString ) DB. StakeAddressId , StakeAddrCache )
171
- queryStakeAddrAux cacheUA mp sts nw cred =
172
- case Map. lookup cred mp of
173
- Just addrId -> do
174
- liftIO $ hitCreds sts
175
- case cacheUA of
176
- EvictAndUpdateCache -> pure (Right addrId, Map. delete cred mp)
177
- _ -> pure (Right addrId, mp)
178
- Nothing -> do
179
- liftIO $ missCreds sts
180
- let ! bs = Ledger. serialiseRewardAccount (Ledger. RewardAccount nw cred)
181
- mAddrId <- mapLeft (,bs) <$> queryStakeAddress bs
182
- case (mAddrId, cacheUA ) of
183
- (Right addrId, UpdateCache ) -> pure (Right addrId, Map. insert cred addrId mp)
184
- (Right addrId, _) -> pure (Right addrId, mp)
185
- (err, _) -> pure (err, mp)
196
+ -- queryStakeAddrAux ::
197
+ -- MonadIO m =>
198
+ -- CacheNew ->
199
+ -- StakeAddrCache ->
200
+ -- StrictTVar IO CacheStatistics ->
201
+ -- Network ->
202
+ -- StakeCred ->
203
+ -- ReaderT SqlBackend m (Either (DB.LookupFail, ByteString) DB.StakeAddressId, StakeAddrCache)
204
+ -- queryStakeAddrAux cacheNew mp sts nw cred =
205
+ -- case Map.lookup cred mp of
206
+ -- Just addrId -> do
207
+ -- liftIO $ hitCreds sts
208
+ -- case cacheNew of
209
+ -- EvictAndReturn -> pure (Right addrId, Map.delete cred mp)
210
+ -- _ -> pure (Right addrId, mp)
211
+ -- Nothing -> do
212
+ -- liftIO $ missCreds sts
213
+ -- let !bs = Ledger.serialiseRewardAccount (Ledger.RewardAccount nw cred)
214
+ -- mAddrId <- mapLeft (,bs) <$> queryStakeAddress bs
215
+ -- case (mAddrId, cacheNew ) of
216
+ -- (Right addrId, CacheNew ) -> pure (Right addrId, Map.insert cred addrId mp)
217
+ -- (Right addrId, _) -> pure (Right addrId, mp)
218
+ -- (err, _) -> pure (err, mp)
186
219
187
220
queryPoolKeyWithCache ::
188
221
MonadIO m =>
@@ -372,7 +405,7 @@ queryDatum ::
372
405
queryDatum cacheStatus hsh = do
373
406
case cacheStatus of
374
407
NoCache -> DB. queryDatum $ Generic. dataHashToBytes hsh
375
- ActiveCache ci -> do
408
+ CacheActive ci -> do
376
409
mp <- liftIO $ readTVarIO (cDatum ci)
377
410
case LRU. lookup hsh mp of
378
411
Just (datumId, mp') -> do
0 commit comments