Skip to content

Commit d5dd869

Browse files
committed
Fix order in range queries
1 parent 15ce0ca commit d5dd869

File tree

7 files changed

+30
-31
lines changed

7 files changed

+30
-31
lines changed

ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Ledger/Query.hs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,17 +1337,12 @@ answerShelleyTraversingQueries ejTxOut ejTxIn filt cfg q forker = case q of
13371337
)
13381338
vs
13391339

1340-
vnull :: ValuesMK k v -> Bool
1341-
vnull (ValuesMK vs) = Map.null vs
1342-
1343-
toMaxKey (LedgerTables (ValuesMK vs)) = fst $ Map.findMax vs
1344-
13451340
loop queryPredicate !prev !acc = do
1346-
extValues <- LedgerDB.roforkerRangeReadTables forker prev
1347-
if ltcollapse $ ltmap (K2 . vnull) extValues
1348-
then pure acc
1349-
else
1341+
(extValues, k) <- LedgerDB.roforkerRangeReadTables forker prev
1342+
case k of
1343+
Nothing -> pure acc
1344+
Just k' ->
13501345
loop
13511346
queryPredicate
1352-
(PreviousQueryWasUpTo $ toMaxKey extValues)
1347+
(PreviousQueryWasUpTo k')
13531348
(combUtxo acc $ partial queryPredicate extValues)

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Storage/LedgerDB/Forker.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ module Ouroboros.Consensus.Storage.LedgerDB.Forker
5555
, TraceValidateEvent (..)
5656
) where
5757

58+
import Data.Bifunctor (first)
5859
import Control.Monad (void)
5960
import Control.Monad.Base
6061
import Control.Monad.Except
@@ -105,7 +106,7 @@ data Forker m l blk = Forker
105106

106107
forkerReadTables :: !(LedgerTables l KeysMK -> m (LedgerTables l ValuesMK))
107108
-- ^ Read ledger tables from disk.
108-
, forkerRangeReadTables :: !(RangeQueryPrevious l -> m (LedgerTables l ValuesMK))
109+
, forkerRangeReadTables :: !(RangeQueryPrevious l -> m (LedgerTables l ValuesMK, Maybe (TxIn l)))
109110
-- ^ Range-read ledger tables from disk.
110111
--
111112
-- This range read will return as many values as the 'QueryBatchSize' that
@@ -206,7 +207,7 @@ ledgerStateReadOnlyForker frk =
206207
ReadOnlyForker
207208
{ roforkerClose = roforkerClose
208209
, roforkerReadTables = fmap castLedgerTables . roforkerReadTables . castLedgerTables
209-
, roforkerRangeReadTables = fmap castLedgerTables . roforkerRangeReadTables . castRangeQueryPrevious
210+
, roforkerRangeReadTables = fmap (first castLedgerTables) . roforkerRangeReadTables . castRangeQueryPrevious
210211
, roforkerGetLedgerState = ledgerState <$> roforkerGetLedgerState
211212
, roforkerReadStatistics = roforkerReadStatistics
212213
}
@@ -239,7 +240,7 @@ data ReadOnlyForker m l blk = ReadOnlyForker
239240
-- ^ See 'forkerClose'
240241
, roforkerReadTables :: !(LedgerTables l KeysMK -> m (LedgerTables l ValuesMK))
241242
-- ^ See 'forkerReadTables'
242-
, roforkerRangeReadTables :: !(RangeQueryPrevious l -> m (LedgerTables l ValuesMK))
243+
, roforkerRangeReadTables :: !(RangeQueryPrevious l -> m (LedgerTables l ValuesMK, Maybe (TxIn l)))
243244
-- ^ See 'forkerRangeReadTables'.
244245
, roforkerGetLedgerState :: !(STM m (l EmptyMK))
245246
-- ^ See 'forkerGetLedgerState'

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Storage/LedgerDB/V1/Forker.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ implForkerRangeReadTables ::
146146
QueryBatchSize ->
147147
ForkerEnv m l blk ->
148148
RangeQueryPrevious l ->
149-
m (LedgerTables l ValuesMK)
149+
m (LedgerTables l ValuesMK, Maybe (TxIn l))
150150
implForkerRangeReadTables qbs env rq0 = do
151151
traceWith (foeTracer env) ForkerRangeReadTablesStart
152152
ldb <- readTVarIO $ foeChangelog env
@@ -175,7 +175,8 @@ implForkerRangeReadTables qbs env rq0 = do
175175
bsvh <- getValueHandle env
176176
values <- BackingStore.bsvhRangeRead bsvh st (rq{BackingStore.rqCount = nrequested})
177177
traceWith (foeTracer env) ForkerRangeReadTablesEnd
178-
pure $ ltliftA2 (doFixupReadResult nrequested) diffs values
178+
let res@(LedgerTables (ValuesMK resValues)) = ltliftA2 (doFixupReadResult nrequested) diffs values
179+
pure (res, fst <$> Map.lookupMax resValues)
179180
where
180181
rq = BackingStore.RangeQuery rq1 (fromIntegral $ defaultQueryBatchSize qbs)
181182

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Storage/LedgerDB/V2/Forker.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,15 @@ implForkerRangeReadTables ::
8585
QueryBatchSize ->
8686
ForkerEnv m l blk ->
8787
RangeQueryPrevious l ->
88-
m (LedgerTables l ValuesMK)
88+
m (LedgerTables l ValuesMK, Maybe (TxIn l))
8989
implForkerRangeReadTables qbs env rq0 = do
9090
traceWith (foeTracer env) ForkerRangeReadTablesStart
9191
ldb <- readTVarIO $ foeLedgerSeq env
9292
let n = fromIntegral $ defaultQueryBatchSize qbs
9393
stateRef = currentHandle ldb
9494
case rq0 of
9595
NoPreviousQuery -> readRange (tables stateRef) (state stateRef) (Nothing, n)
96-
PreviousQueryWasFinal -> pure $ LedgerTables emptyMK
96+
PreviousQueryWasFinal -> pure (LedgerTables emptyMK, Nothing)
9797
PreviousQueryWasUpTo k -> do
9898
tbs <- readRange (tables stateRef) (state stateRef) (Just k, n)
9999
traceWith (foeTracer env) ForkerRangeReadTablesEnd

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Storage/LedgerDB/V2/InMemory.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ newInMemoryLedgerTablesHandle tracer someFS@(SomeHasFS hasFS) l = do
112112
guardClosed
113113
hs
114114
( \(LedgerTables (ValuesMK m)) ->
115-
pure . LedgerTables . ValuesMK . Map.take t . (maybe id (\g -> snd . Map.split g) f) $ m
115+
let m' = Map.take t . (maybe id (\g -> snd . Map.split g) f) $ m
116+
in pure (LedgerTables (ValuesMK m'), fst <$> Map.lookupMax m')
116117
)
117118
, readAll = \_ -> do
118119
hs <- readTVarIO tv

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Storage/LedgerDB/V2/LSM.hs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,9 @@ newLSMLedgerTablesHandle tracer rr session (resKey, t0) = do
167167
, readRange = implReadRange tv
168168
, readAll = \st ->
169169
let readAll' m = do
170-
v@(LedgerTables (ValuesMK values)) <- implReadRange tv st (m, 100000)
171-
maybe (pure v) (\k -> fmap (ltliftA2 unionValues v) $ readAll' (Just $ fst k)) $
172-
Map.lookupMax values
173-
in -- TODO!! Be careful with the order of the keys, the last in the map
174-
-- is maybe not the last in the serialized form
175-
readAll' Nothing
170+
(v, n) <- implReadRange tv st (m, 100000)
171+
maybe (pure v) (\k -> fmap (ltliftA2 unionValues v) $ readAll' (Just k)) n
172+
in readAll' Nothing
176173
, pushDiffs = const (implPushDiffs tv)
177174
, takeHandleSnapshot = \_ snapshotName -> do
178175
guardClosed tv $
@@ -181,16 +178,14 @@ newLSMLedgerTablesHandle tracer rr session (resKey, t0) = do
181178
, tablesSize = pure Nothing
182179
}
183180

184-
-- TODO: use bytestrings as values
185-
186181
implReadRange ::
187182
IOLike m =>
188183
HasLedgerTables l =>
189184
GoodForLSM l =>
190185
StrictTVar m (LedgerTablesHandleState m l) ->
191186
l EmptyMK ->
192187
(Maybe (TxIn l), Int) ->
193-
m (LedgerTables l ValuesMK)
188+
m (LedgerTables l ValuesMK, Maybe (TxIn l))
194189
implReadRange tv st = \(mPrev, num) ->
195190
guardClosed
196191
tv
@@ -200,9 +195,15 @@ implReadRange tv st = \(mPrev, num) ->
200195
cursorFromKey k = fmap (V.drop 1) $ LSM.withCursorAtOffset table k (LSM.take $ num + 1)
201196
in
202197
do
203-
entries <- maybe cursorFromStart cursorFromKey mPrev
204-
pure . LedgerTables . ValuesMK . Map.fromList $
205-
[(k, (fromLSMTxOut st v)) | LSM.Entry k v <- V.toList entries]
198+
entries <- V.toList <$> maybe cursorFromStart cursorFromKey mPrev
199+
pure (LedgerTables . ValuesMK . Map.fromList $
200+
[(k, (fromLSMTxOut st v)) | LSM.Entry k v <- entries ]
201+
, case snd <$> List.unsnoc entries of
202+
Nothing -> Nothing
203+
Just (LSM.Entry k _) -> Just k
204+
Just (LSM.EntryWithBlob k _ _) -> Just k
205+
206+
)
206207
)
207208

208209
implPushDiffs ::

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Storage/LedgerDB/V2/LedgerSeq.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ data LedgerTablesHandle m l = LedgerTablesHandle
8686
, duplicate :: !(m (LedgerTablesHandle m l))
8787
-- ^ It is expected that this operation takes constant time.
8888
, read :: !(l EmptyMK -> LedgerTables l KeysMK -> m (LedgerTables l ValuesMK))
89-
, readRange :: !(l EmptyMK -> (Maybe (TxIn l), Int) -> m (LedgerTables l ValuesMK))
89+
, readRange :: !(l EmptyMK -> (Maybe (TxIn l), Int) -> m (LedgerTables l ValuesMK, Maybe (TxIn l)))
9090
, readAll :: !(l EmptyMK -> m (LedgerTables l ValuesMK))
9191
-- ^ Costly read all operation, not to be used in Consensus but only in
9292
-- snapshot-converter executable.

0 commit comments

Comments
 (0)