haskoin-store 0.23.5 → 0.23.6
raw patch · 3 files changed
+43/−41 lines, 3 files
Files
- CHANGELOG.md +4/−0
- haskoin-store.cabal +2/−2
- src/Haskoin/Store/Cache.hs +37/−39
CHANGELOG.md view
@@ -5,6 +5,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## 0.23.5+### Changed+- Tighten the locking loop to avoid slow cache building.++## 0.23.5 ### Fixed - Wrong error in cache when acquiring lock.
haskoin-store.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 3fbc04a606e83256cd4b8fe8afca1756d9d5c3ac8737830de272144183e088ed+-- hash: ed9717f6673f6dc980e5bf539fbd715a4d5c18968c4aec11058a10f84aecd382 name: haskoin-store-version: 0.23.5+version: 0.23.6 synopsis: Storage and index for Bitcoin and Bitcoin Cash description: Store and index Bitcoin or Bitcoin Cash blocks, transactions, balances and unspent outputs. All data is available via REST API in JSON or binary format.
src/Haskoin/Store/Cache.hs view
@@ -508,16 +508,13 @@ pruneDB :: (MonadUnliftIO m, MonadLoggerIO m, StoreRead m) => CacheT m Integer pruneDB =- withLock go >>= \case- Nothing -> return 0- Just n -> return n- where- go = do+ withLockWait $ do x <- asks cacheMax s <- runRedis Redis.dbsize if s > x then flush (s - x) else return 0+ where flush n = do case min 1000 (n `div` 64) of 0 -> return 0@@ -554,22 +551,20 @@ (MonadUnliftIO m, MonadLoggerIO m, StoreRead m) => XPubSpec -> CacheT m ([XPubBal], Bool)-newXPubC xpub =- withLockWait $ do- bals <- lift $ xPubBals xpub- x <- asks cacheMin- xpubtxt <- xpubText xpub- let n = lenNotNull bals- if x <= n- then do- go bals- return (bals, True)- else do- $(logDebugS) "Cache" $- "Not caching xpub with " <> cs (show n) <>- " used addresses: " <>- xpubtxt- return (bals, False)+newXPubC xpub = do+ bals <- lift $ xPubBals xpub+ x <- asks cacheMin+ xpubtxt <- xpubText xpub+ let n = lenNotNull bals+ if x <= n+ then do+ go bals+ return (bals, True)+ else do+ $(logDebugS) "Cache" $+ "Not caching xpub with " <> cs (show n) <> " used addresses: " <>+ xpubtxt+ return (bals, False) where op XPubUnspent {xPubUnspent = u} = (unspentPoint u, unspentBlock u) go bals = do@@ -589,7 +584,7 @@ "Caching xpub with " <> cs (show (length xtxs)) <> " txs: " <> xpubtxt now <- systemSeconds <$> liftIO getSystemTime- runRedis $ do+ withLockWait . runRedis $ do b <- redisTouchKeys now [xpub] c <- redisAddXPubBalances xpub bals d <- redisAddXPubUnspents xpub (map op utxo)@@ -598,7 +593,6 @@ newBlockC :: (MonadUnliftIO m, MonadLoggerIO m, StoreRead m) => CacheT m () newBlockC =- withLockWait $ lift getBestBlock >>= \case Nothing -> $(logErrorS) "Cache" "Best block not set yet" Just newhead -> do@@ -658,7 +652,6 @@ newTxC :: (MonadUnliftIO m, MonadLoggerIO m, StoreRead m) => TxHash -> CacheT m () newTxC th =- withLockWait $ lift (getTxData th) >>= \case Just txd -> do $(logDebugS) "Cache" $ "Importing transaction: " <> txHashToHex th@@ -721,19 +714,22 @@ "Affected xpub " <> cs (show i) <> "/" <> cs (show (length xpubs)) <> ": " <> xpubtxt- bals <- getxbals xpubs- let xmap = HashMap.filter (not . null) (HashMap.fromList bals)- addrs' = getNewAddrs gap xmap (HashMap.elems addrmap)- runRedis $- if not (HashMap.null xmap)- then do- x <- redisImportMultiTx addrmap unspentmap txs- y <- redisUpdateBalances addrmap balmap- z <- redisTouchKeys now xpubs- return $ x >> y >> z >> return ()- else return (return ())+ addrs' <-+ withLockWait $+ getxbals xpubs >>= \xmap ->+ if null xmap+ then return []+ else do+ let addrmap' = faddrmap (HashMap.keysSet xmap) addrmap+ runRedis $ do+ x <- redisImportMultiTx addrmap' unspentmap txs+ y <- redisUpdateBalances addrmap' balmap+ z <- redisTouchKeys now (HashMap.keys xmap)+ return $ x >> y >> z >> return ()+ return $ getNewAddrs gap xmap (HashMap.elems addrmap') cacheAddAddresses addrs' where+ faddrmap xmap = HashMap.filter (\a -> addressXPubSpec a `elem` xmap) getaddrmap = HashMap.fromList . catMaybes . zipWith (\a -> fmap (a, )) alladdrs <$> cacheGetAddrsInfo alladdrs@@ -742,10 +738,12 @@ lift (mapM getUnspent allops) getbalances addrs = HashMap.fromList . zipWith (,) addrs <$> mapM (lift . getBalance) addrs- getxbals xpubs =- runRedis . fmap sequence . forM xpubs $ \xpub -> do- bs <- redisGetXPubBalances xpub- return $ (xpub, ) <$> bs+ getxbals xpubs = do+ bals <-+ runRedis . fmap sequence . forM xpubs $ \xpub -> do+ bs <- redisGetXPubBalances xpub+ return $ (xpub, ) <$> bs+ return $ HashMap.filter (not . null) (HashMap.fromList bals) allops = map snd $ concatMap txInputs txs <> concatMap txOutputs txs alladdrs = nub . map fst $ concatMap txInputs txs <> concatMap txOutputs txs allxpubs addrmap = nub . map addressXPubSpec $ HashMap.elems addrmap