Browse Source

internal/ethapi: add debug.chaindbCompact

Felix Lange 9 years ago
parent
commit
66ee2dec53
2 changed files with 23 additions and 0 deletions
  1. 19 0
      internal/ethapi/api.go
  2. 4 0
      internal/web3ext/web3ext.go

+ 19 - 0
internal/ethapi/api.go

@@ -39,6 +39,7 @@ import (
 	"github.com/ethereum/go-ethereum/rlp"
 	"github.com/ethereum/go-ethereum/rpc"
 	"github.com/syndtr/goleveldb/leveldb"
+	"github.com/syndtr/goleveldb/leveldb/util"
 	"golang.org/x/net/context"
 )
 
@@ -1321,6 +1322,24 @@ func (api *PrivateDebugAPI) ChaindbProperty(property string) (string, error) {
 	return ldb.LDB().GetProperty(property)
 }
 
+func (api *PrivateDebugAPI) ChaindbCompact() error {
+	ldb, ok := api.b.ChainDb().(interface {
+		LDB() *leveldb.DB
+	})
+	if !ok {
+		return fmt.Errorf("chaindbCompact does not work for memory databases")
+	}
+	for b := byte(0); b < 255; b++ {
+		glog.V(logger.Info).Infof("compacting chain DB range 0x%0.2X-0x%0.2X", b, b+1)
+		err := ldb.LDB().CompactRange(util.Range{Start: []byte{b}, Limit: []byte{b + 1}})
+		if err != nil {
+			glog.Errorf("compaction error: %v", err)
+			return err
+		}
+	}
+	return nil
+}
+
 // SetHead rewinds the head of the blockchain to a previous block.
 func (api *PrivateDebugAPI) SetHead(number rpc.HexNumber) {
 	api.b.SetHead(uint64(number.Int64()))

+ 4 - 0
internal/web3ext/web3ext.go

@@ -337,6 +337,10 @@ web3._extend({
 			params: 1,
 			outputFormatter: console.log
 		}),
+		new web3._extend.Method({
+			name: 'chaindbCompact',
+			call: 'debug_chaindbCompact',
+		}),
 		new web3._extend.Method({
 			name: 'metrics',
 			call: 'debug_metrics',