package core
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
abcitypes "github.com/tendermint/tendermint/abci/types"
|
|
ctypes "github.com/tendermint/tendermint/rpc/core/types"
|
|
rpctypes "github.com/tendermint/tendermint/rpc/jsonrpc/types"
|
|
"github.com/tendermint/tendermint/state/indexer"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
// UnsafeFlushMempool removes all transactions from the mempool.
|
|
func (env *Environment) UnsafeFlushMempool(ctx *rpctypes.Context) (*ctypes.ResultUnsafeFlushMempool, error) {
|
|
env.Mempool.Flush()
|
|
return &ctypes.ResultUnsafeFlushMempool{}, nil
|
|
}
|
|
|
|
// UnsafeReIndex re-index the block/transaction events into the eventsinks.
|
|
func (env *Environment) UnsafeReIndex(
|
|
ctx *rpctypes.Context,
|
|
start int64,
|
|
end int64) (*ctypes.ResultUnsafeReIndex, error) {
|
|
|
|
base := env.BlockStore.Base()
|
|
|
|
if start <= base {
|
|
return nil, fmt.Errorf("%s (requested start height: %d, base height: %d)", ctypes.ErrHeightNotAvailable, start, base)
|
|
}
|
|
|
|
height := env.BlockStore.Height()
|
|
if start > height {
|
|
return nil, fmt.Errorf(
|
|
"%s (requested start height: %d, store height: %d)", ctypes.ErrHeightNotAvailable, start, height)
|
|
}
|
|
|
|
if end <= base {
|
|
return nil, fmt.Errorf(
|
|
"%s (requested end height: %d, base height: %d)", ctypes.ErrHeightNotAvailable, end, base)
|
|
}
|
|
|
|
if end < start {
|
|
return nil, fmt.Errorf(
|
|
"%s (requested the end height: %d is less than the start height: %d)", ctypes.ErrInvalidRequest, start, end)
|
|
}
|
|
|
|
if end > height {
|
|
end = height
|
|
}
|
|
|
|
if !indexer.IndexingEnabled(env.EventSinks) {
|
|
return nil, fmt.Errorf("no event sink has been enabled")
|
|
}
|
|
|
|
for i := start; i <= end; i++ {
|
|
select {
|
|
case <-ctx.Context().Done():
|
|
return nil, ctx.Context().Err()
|
|
default:
|
|
b := env.BlockStore.LoadBlock(i)
|
|
if b == nil {
|
|
return nil, fmt.Errorf("not able to load block at height %d from the blockstore", i)
|
|
}
|
|
|
|
r, err := env.StateStore.LoadABCIResponses(i)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("not able to load ABCI Response at height %d from the statestore", i)
|
|
}
|
|
|
|
e := types.EventDataNewBlockHeader{
|
|
Header: b.Header,
|
|
NumTxs: int64(len(b.Txs)),
|
|
ResultBeginBlock: *r.BeginBlock,
|
|
ResultEndBlock: *r.EndBlock,
|
|
}
|
|
|
|
var batch *indexer.Batch
|
|
if e.NumTxs > 0 {
|
|
batch = indexer.NewBatch(e.NumTxs)
|
|
|
|
for i, tx := range b.Data.Txs {
|
|
tr := abcitypes.TxResult{
|
|
Height: b.Height,
|
|
Index: uint32(i),
|
|
Tx: tx,
|
|
Result: *(r.DeliverTxs[i]),
|
|
}
|
|
|
|
_ = batch.Add(&tr)
|
|
}
|
|
}
|
|
|
|
for _, sink := range env.EventSinks {
|
|
if err := sink.IndexBlockEvents(e); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if batch != nil {
|
|
if err := sink.IndexTxEvents(batch.Ops); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return &ctypes.ResultUnsafeReIndex{Result: "re-index finished"}, nil
|
|
}
|