Increase xpub cache, reduce logging
This commit is contained in:
parent
9c44fd4f22
commit
66023becd6
@ -105,7 +105,7 @@ func (w *Worker) GetSpendingTxid(txid string, n int) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
glog.Info("GetSpendingTxid ", txid, " ", n, " finished in ", time.Since(start))
|
glog.Info("GetSpendingTxid ", txid, " ", n, ", ", time.Since(start))
|
||||||
return tx.Vout[n].SpentTxID, nil
|
return tx.Vout[n].SpentTxID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -954,7 +954,7 @@ func (w *Worker) GetAddress(address string, page int, txsOnPage int, option Acco
|
|||||||
Erc20Contract: erc20c,
|
Erc20Contract: erc20c,
|
||||||
Nonce: nonce,
|
Nonce: nonce,
|
||||||
}
|
}
|
||||||
glog.Info("GetAddress ", address, " finished in ", time.Since(start))
|
glog.Info("GetAddress ", address, ", ", time.Since(start))
|
||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1157,7 +1157,7 @@ func (w *Worker) GetBalanceHistory(address string, fromTimestamp, toTimestamp in
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
glog.Info("GetBalanceHistory ", address, ", blocks ", fromHeight, "-", toHeight, ", count ", len(bha), " finished in ", time.Since(start))
|
glog.Info("GetBalanceHistory ", address, ", blocks ", fromHeight, "-", toHeight, ", count ", len(bha), ", ", time.Since(start))
|
||||||
return bha, nil
|
return bha, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1305,7 +1305,7 @@ func (w *Worker) GetAddressUtxo(address string, onlyConfirmed bool) (Utxos, erro
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
glog.Info("GetAddressUtxo ", address, ", ", len(r), " utxos, finished in ", time.Since(start))
|
glog.Info("GetAddressUtxo ", address, ", ", len(r), " utxos, ", time.Since(start))
|
||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1335,7 +1335,7 @@ func (w *Worker) GetBlocks(page int, blocksOnPage int) (*Blocks, error) {
|
|||||||
}
|
}
|
||||||
r.Blocks[i-from] = *bi
|
r.Blocks[i-from] = *bi
|
||||||
}
|
}
|
||||||
glog.Info("GetBlocks page ", page, " finished in ", time.Since(start))
|
glog.Info("GetBlocks page ", page, ", ", time.Since(start))
|
||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1597,7 +1597,7 @@ func (w *Worker) GetFeeStats(bid string) (*FeeStats, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.Info("GetFeeStats ", bid, " (", len(feesPerKb), " txs) finished in ", time.Since(start))
|
glog.Info("GetFeeStats ", bid, " (", len(feesPerKb), " txs), ", time.Since(start))
|
||||||
|
|
||||||
return &FeeStats{
|
return &FeeStats{
|
||||||
TxCount: len(feesPerKb),
|
TxCount: len(feesPerKb),
|
||||||
@ -1649,7 +1649,7 @@ func (w *Worker) GetBlock(bid string, page int, txsOnPage int) (*Block, error) {
|
|||||||
}
|
}
|
||||||
txs = txs[:txi]
|
txs = txs[:txi]
|
||||||
bi.Txids = nil
|
bi.Txids = nil
|
||||||
glog.Info("GetBlock ", bid, ", page ", page, " finished in ", time.Since(start))
|
glog.Info("GetBlock ", bid, ", page ", page, ", ", time.Since(start))
|
||||||
return &Block{
|
return &Block{
|
||||||
Paging: pg,
|
Paging: pg,
|
||||||
BlockInfo: BlockInfo{
|
BlockInfo: BlockInfo{
|
||||||
@ -1790,7 +1790,7 @@ func (w *Worker) GetSystemInfo(internal bool) (*SystemInfo, error) {
|
|||||||
Consensus: ci.Consensus,
|
Consensus: ci.Consensus,
|
||||||
}
|
}
|
||||||
w.is.SetBackendInfo(backendInfo)
|
w.is.SetBackendInfo(backendInfo)
|
||||||
glog.Info("GetSystemInfo finished in ", time.Since(start))
|
glog.Info("GetSystemInfo, ", time.Since(start))
|
||||||
return &SystemInfo{blockbookInfo, backendInfo}, nil
|
return &SystemInfo{blockbookInfo, backendInfo}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
40
api/xpub.go
40
api/xpub.go
@ -19,8 +19,8 @@ const maxAddressesGap = 10000
|
|||||||
const txInput = 1
|
const txInput = 1
|
||||||
const txOutput = 2
|
const txOutput = 2
|
||||||
|
|
||||||
const xpubCacheSize = 512
|
const xpubCacheSize = 4096
|
||||||
const xpubCacheExpirationSeconds = 7200
|
const xpubCacheExpirationSeconds = 3600
|
||||||
|
|
||||||
var cachedXpubs = make(map[string]xpubData)
|
var cachedXpubs = make(map[string]xpubData)
|
||||||
var cachedXpubsMux sync.Mutex
|
var cachedXpubsMux sync.Mutex
|
||||||
@ -266,12 +266,12 @@ func evictXpubCacheItems() {
|
|||||||
delete(cachedXpubs, oldestKey)
|
delete(cachedXpubs, oldestKey)
|
||||||
count++
|
count++
|
||||||
}
|
}
|
||||||
glog.Info("Evicted ", count, " items from xpub cache, oldest item accessed at ", time.Unix(oldest, 0), ", cache size ", len(cachedXpubs))
|
glog.V(1).Info("Evicted ", count, " items from xpub cache, oldest item accessed at ", time.Unix(oldest, 0), ", cache size ", len(cachedXpubs))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Worker) getXpubData(xpub string, page int, txsOnPage int, option AccountDetails, filter *AddressFilter, gap int) (*xpubData, uint32, error) {
|
func (w *Worker) getXpubData(xpub string, page int, txsOnPage int, option AccountDetails, filter *AddressFilter, gap int) (*xpubData, uint32, bool, error) {
|
||||||
if w.chainType != bchain.ChainBitcoinType {
|
if w.chainType != bchain.ChainBitcoinType {
|
||||||
return nil, 0, ErrUnsupportedXpub
|
return nil, 0, false, ErrUnsupportedXpub
|
||||||
}
|
}
|
||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
@ -288,28 +288,28 @@ func (w *Worker) getXpubData(xpub string, page int, txsOnPage int, option Accoun
|
|||||||
gap++
|
gap++
|
||||||
var processedHash string
|
var processedHash string
|
||||||
cachedXpubsMux.Lock()
|
cachedXpubsMux.Lock()
|
||||||
data, found := cachedXpubs[xpub]
|
data, inCache := cachedXpubs[xpub]
|
||||||
cachedXpubsMux.Unlock()
|
cachedXpubsMux.Unlock()
|
||||||
// to load all data for xpub may take some time, do it in a loop to process a possible new block
|
// to load all data for xpub may take some time, do it in a loop to process a possible new block
|
||||||
for {
|
for {
|
||||||
bestheight, besthash, err = w.db.GetBestBlock()
|
bestheight, besthash, err = w.db.GetBestBlock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, errors.Annotatef(err, "GetBestBlock")
|
return nil, 0, inCache, errors.Annotatef(err, "GetBestBlock")
|
||||||
}
|
}
|
||||||
if besthash == processedHash {
|
if besthash == processedHash {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
fork := false
|
fork := false
|
||||||
if !found || data.gap != gap {
|
if !inCache || data.gap != gap {
|
||||||
data = xpubData{gap: gap}
|
data = xpubData{gap: gap}
|
||||||
data.basePath, err = w.chainParser.DerivationBasePath(xpub)
|
data.basePath, err = w.chainParser.DerivationBasePath(xpub)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, err
|
return nil, 0, inCache, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
hash, err := w.db.GetBlockHash(data.dataHeight)
|
hash, err := w.db.GetBlockHash(data.dataHeight)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, err
|
return nil, 0, inCache, err
|
||||||
}
|
}
|
||||||
if hash != data.dataHash {
|
if hash != data.dataHash {
|
||||||
// in case of for reset all cached data
|
// in case of for reset all cached data
|
||||||
@ -326,18 +326,18 @@ func (w *Worker) getXpubData(xpub string, page int, txsOnPage int, option Accoun
|
|||||||
var lastUsedIndex int
|
var lastUsedIndex int
|
||||||
lastUsedIndex, data.addresses, err = w.xpubScanAddresses(xpub, &data, data.addresses, gap, 0, 0, fork)
|
lastUsedIndex, data.addresses, err = w.xpubScanAddresses(xpub, &data, data.addresses, gap, 0, 0, fork)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, err
|
return nil, 0, inCache, err
|
||||||
}
|
}
|
||||||
_, data.changeAddresses, err = w.xpubScanAddresses(xpub, &data, data.changeAddresses, gap, 1, lastUsedIndex, fork)
|
_, data.changeAddresses, err = w.xpubScanAddresses(xpub, &data, data.changeAddresses, gap, 1, lastUsedIndex, fork)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, err
|
return nil, 0, inCache, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if option >= AccountDetailsTxidHistory {
|
if option >= AccountDetailsTxidHistory {
|
||||||
for _, da := range [][]xpubAddress{data.addresses, data.changeAddresses} {
|
for _, da := range [][]xpubAddress{data.addresses, data.changeAddresses} {
|
||||||
for i := range da {
|
for i := range da {
|
||||||
if err = w.xpubCheckAndLoadTxids(&da[i], filter, bestheight, (page+1)*txsOnPage); err != nil {
|
if err = w.xpubCheckAndLoadTxids(&da[i], filter, bestheight, (page+1)*txsOnPage); err != nil {
|
||||||
return nil, 0, err
|
return nil, 0, inCache, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -350,7 +350,7 @@ func (w *Worker) getXpubData(xpub string, page int, txsOnPage int, option Accoun
|
|||||||
}
|
}
|
||||||
cachedXpubs[xpub] = data
|
cachedXpubs[xpub] = data
|
||||||
cachedXpubsMux.Unlock()
|
cachedXpubsMux.Unlock()
|
||||||
return &data, bestheight, nil
|
return &data, bestheight, inCache, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetXpubAddress computes address value and gets transactions for given address
|
// GetXpubAddress computes address value and gets transactions for given address
|
||||||
@ -376,7 +376,7 @@ func (w *Worker) GetXpubAddress(xpub string, page int, txsOnPage int, option Acc
|
|||||||
uBalSat big.Int
|
uBalSat big.Int
|
||||||
unconfirmedTxs int
|
unconfirmedTxs int
|
||||||
)
|
)
|
||||||
data, bestheight, err := w.getXpubData(xpub, page, txsOnPage, option, filter, gap)
|
data, bestheight, inCache, err := w.getXpubData(xpub, page, txsOnPage, option, filter, gap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -544,14 +544,14 @@ func (w *Worker) GetXpubAddress(xpub string, page int, txsOnPage int, option Acc
|
|||||||
Tokens: tokens,
|
Tokens: tokens,
|
||||||
XPubAddresses: xpubAddresses,
|
XPubAddresses: xpubAddresses,
|
||||||
}
|
}
|
||||||
glog.Info("GetXpubAddress ", xpub[:16], ", ", len(data.addresses)+len(data.changeAddresses), " derived addresses, ", txCount, " confirmed txs, finished in ", time.Since(start))
|
glog.Info("GetXpubAddress ", xpub[:16], ", cache ", inCache, ", ", len(data.addresses)+len(data.changeAddresses), " addresses, ", txCount, " txs, ", time.Since(start))
|
||||||
return &addr, nil
|
return &addr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetXpubUtxo returns unspent outputs for given xpub
|
// GetXpubUtxo returns unspent outputs for given xpub
|
||||||
func (w *Worker) GetXpubUtxo(xpub string, onlyConfirmed bool, gap int) (Utxos, error) {
|
func (w *Worker) GetXpubUtxo(xpub string, onlyConfirmed bool, gap int) (Utxos, error) {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
data, _, err := w.getXpubData(xpub, 0, 1, AccountDetailsBasic, &AddressFilter{
|
data, _, inCache, err := w.getXpubData(xpub, 0, 1, AccountDetailsBasic, &AddressFilter{
|
||||||
Vout: AddressFilterVoutOff,
|
Vout: AddressFilterVoutOff,
|
||||||
OnlyConfirmed: onlyConfirmed,
|
OnlyConfirmed: onlyConfirmed,
|
||||||
}, gap)
|
}, gap)
|
||||||
@ -585,7 +585,7 @@ func (w *Worker) GetXpubUtxo(xpub string, onlyConfirmed bool, gap int) (Utxos, e
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
sort.Stable(r)
|
sort.Stable(r)
|
||||||
glog.Info("GetXpubUtxo ", xpub[:16], ", ", len(r), " utxos, finished in ", time.Since(start))
|
glog.Info("GetXpubUtxo ", xpub[:16], ", cache ", inCache, ", ", len(r), " utxos, ", time.Since(start))
|
||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -597,7 +597,7 @@ func (w *Worker) GetXpubBalanceHistory(xpub string, fromTimestamp, toTimestamp i
|
|||||||
if fromHeight >= toHeight {
|
if fromHeight >= toHeight {
|
||||||
return bhs, nil
|
return bhs, nil
|
||||||
}
|
}
|
||||||
data, _, err := w.getXpubData(xpub, 0, 1, AccountDetailsTxidHistory, &AddressFilter{
|
data, _, inCache, err := w.getXpubData(xpub, 0, 1, AccountDetailsTxidHistory, &AddressFilter{
|
||||||
Vout: AddressFilterVoutOff,
|
Vout: AddressFilterVoutOff,
|
||||||
OnlyConfirmed: true,
|
OnlyConfirmed: true,
|
||||||
FromHeight: fromHeight,
|
FromHeight: fromHeight,
|
||||||
@ -632,6 +632,6 @@ func (w *Worker) GetXpubBalanceHistory(xpub string, fromTimestamp, toTimestamp i
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
glog.Info("GetUtxoBalanceHistory ", xpub[:16], ", blocks ", fromHeight, "-", toHeight, ", count ", len(bha), ", finished in ", time.Since(start))
|
glog.Info("GetUtxoBalanceHistory ", xpub[:16], ", cache ", inCache, ", blocks ", fromHeight, "-", toHeight, ", count ", len(bha), ", ", time.Since(start))
|
||||||
return bha, nil
|
return bha, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user