From 7cb8c8d3f0c7e88828e466c7836fd6ee34fc9641 Mon Sep 17 00:00:00 2001 From: Martin Boehm Date: Mon, 14 May 2018 15:49:08 +0200 Subject: [PATCH] Add option to disable txcache --- blockbook.go | 4 +++- db/txcache.go | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/blockbook.go b/blockbook.go index 1aedb3c0..1de5c3cc 100644 --- a/blockbook.go +++ b/blockbook.go @@ -63,6 +63,8 @@ var ( explorerURL = flag.String("explorer", "", "address of blockchain explorer") coin = flag.String("coin", "btc", "coin name") + + noTxCache = flag.Bool("notxcache", false, "disable tx cache") ) var ( @@ -156,7 +158,7 @@ func main() { return } - if txCache, err = db.NewTxCache(index, chain, metrics); err != nil { + if txCache, err = db.NewTxCache(index, chain, metrics, !*noTxCache); err != nil { glog.Error("txCache ", err) return } diff --git a/db/txcache.go b/db/txcache.go index 3b339352..8c30b42a 100644 --- a/db/txcache.go +++ b/db/txcache.go @@ -12,29 +12,39 @@ type TxCache struct { db *RocksDB chain bchain.BlockChain metrics *common.Metrics + enabled bool } // NewTxCache creates new TxCache interface and returns its handle -func NewTxCache(db *RocksDB, chain bchain.BlockChain, metrics *common.Metrics) (*TxCache, error) { +func NewTxCache(db *RocksDB, chain bchain.BlockChain, metrics *common.Metrics, enabled bool) (*TxCache, error) { + if !enabled { + glog.Info("txcache: disabled") + } return &TxCache{ db: db, chain: chain, metrics: metrics, + enabled: enabled, }, nil } // GetTransaction returns transaction either from RocksDB or if not present from blockchain // it the transaction is confirmed, it is stored in the RocksDB func (c *TxCache) GetTransaction(txid string, bestheight uint32) (*bchain.Tx, uint32, error) { - tx, h, err := c.db.GetTx(txid) - if err != nil { - return nil, 0, err - } - if tx != nil { - // number of confirmations is not stored in cache, they change all the time - tx.Confirmations = bestheight - h + 1 - c.metrics.TxCacheEfficiency.With(common.Labels{"status": "hit"}).Inc() - return tx, h, nil + var tx *bchain.Tx + var h uint32 + var err error + if c.enabled { + tx, h, err = c.db.GetTx(txid) + if err != nil { + return nil, 0, err + } + if tx != nil { + // number of confirmations is not stored in cache, they change all the time + tx.Confirmations = bestheight - h + 1 + c.metrics.TxCacheEfficiency.With(common.Labels{"status": "hit"}).Inc() + return tx, h, nil + } } tx, err = c.chain.GetTransaction(txid) if err != nil { @@ -45,10 +55,12 @@ func (c *TxCache) GetTransaction(txid string, bestheight uint32) (*bchain.Tx, ui if tx.Confirmations > 0 { // the transaction in the currently best block has 1 confirmation h = bestheight - tx.Confirmations + 1 - err = c.db.PutTx(tx, h, tx.Blocktime) - // do not return caching error, only log it - if err != nil { - glog.Error("PutTx error ", err) + if c.enabled { + err = c.db.PutTx(tx, h, tx.Blocktime) + // do not return caching error, only log it + if err != nil { + glog.Error("PutTx error ", err) + } } } else { h = 0