diff --git a/eth/api.go b/eth/api.go index 508070646..105886752 100644 --- a/eth/api.go +++ b/eth/api.go @@ -26,6 +26,7 @@ import ( "math/big" "os" "runtime" + "strings" "sync" "time" @@ -46,6 +47,7 @@ import ( "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" + "github.com/syndtr/goleveldb/leveldb" "golang.org/x/net/context" ) @@ -1566,6 +1568,22 @@ func NewPrivateDebugAPI(config *core.ChainConfig, eth *Ethereum) *PrivateDebugAP return &PrivateDebugAPI{config: config, eth: eth} } +// ChaindbProperty returns leveldb properties of the chain database. +func (api *PrivateDebugAPI) ChaindbProperty(property string) (string, error) { + ldb, ok := api.eth.chainDb.(interface { + LDB() *leveldb.DB + }) + if !ok { + return "", fmt.Errorf("chaindbProperty does not work for memory databases") + } + if property == "" { + property = "leveldb.stats" + } else if !strings.HasPrefix(property, "leveldb.") { + property = "leveldb." + property + } + return ldb.LDB().GetProperty(property) +} + // BlockTraceResults is the returned value when replaying a block to check for // consensus results and full VM trace logs for all included transactions. type BlockTraceResult struct { diff --git a/rpc/javascript.go b/rpc/javascript.go index d6ffcdf22..166a5289c 100644 --- a/rpc/javascript.go +++ b/rpc/javascript.go @@ -295,6 +295,12 @@ web3._extend({ call: 'debug_dumpBlock', params: 1 }), + new web3._extend.Method({ + name: 'chaindbProperty', + call: 'debug_chaindbProperty', + params: 1, + outputFormatter: console.log + }), new web3._extend.Method({ name: 'metrics', call: 'debug_metrics',