diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-07-23 16:17:18 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-07-23 16:17:18 +0800 |
commit | b403b9e4c398a285c0e307771761b29bab47adb9 (patch) | |
tree | b9991d8a9ab71e84a1350e0769ec9ae59ecd3cc0 /ethdb | |
parent | 26a269ea09667f7e49b89f96bb5eaee66c0d10f8 (diff) | |
parent | c7e7778f2a7d80fa12643db546db98fa70f2e384 (diff) | |
download | dexon-b403b9e4c398a285c0e307771761b29bab47adb9.tar dexon-b403b9e4c398a285c0e307771761b29bab47adb9.tar.gz dexon-b403b9e4c398a285c0e307771761b29bab47adb9.tar.bz2 dexon-b403b9e4c398a285c0e307771761b29bab47adb9.tar.lz dexon-b403b9e4c398a285c0e307771761b29bab47adb9.tar.xz dexon-b403b9e4c398a285c0e307771761b29bab47adb9.tar.zst dexon-b403b9e4c398a285c0e307771761b29bab47adb9.zip |
Merge pull request #1508 from karalabe/database-caching
cmd, core, eth, ethdb: cache flag to allocate memory for db internal use
Diffstat (limited to 'ethdb')
-rw-r--r-- | ethdb/database.go | 31 | ||||
-rw-r--r-- | ethdb/database_test.go | 3 |
2 files changed, 26 insertions, 8 deletions
diff --git a/ethdb/database.go b/ethdb/database.go index c75136a1b..38e454c00 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -17,6 +17,7 @@ package ethdb import ( + "path/filepath" "strconv" "strings" "sync" @@ -36,6 +37,14 @@ import ( var OpenFileLimit = 64 +// cacheRatio specifies how the total alloted cache is distributed between the +// various system databases. +var cacheRatio = map[string]float64{ + "blockchain": 1.0 / 13.0, + "extra": 2.0 / 13.0, + "state": 10.0 / 13.0, +} + type LDBDatabase struct { fn string // filename for reporting db *leveldb.DB // LevelDB instance @@ -57,14 +66,24 @@ type LDBDatabase struct { // NewLDBDatabase returns a LevelDB wrapped object. LDBDatabase does not persist data by // it self but requires a background poller which syncs every X. `Flush` should be called // when data needs to be stored and written to disk. -func NewLDBDatabase(file string) (*LDBDatabase, error) { - // Open the db - db, err := leveldb.OpenFile(file, &opt.Options{OpenFilesCacheCapacity: OpenFileLimit}) - // check for corruption and attempt to recover - if _, iscorrupted := err.(*errors.ErrCorrupted); iscorrupted { +func NewLDBDatabase(file string, cache int) (*LDBDatabase, error) { + // Calculate the cache allowance for this particular database + cache = int(float64(cache) * cacheRatio[filepath.Base(file)]) + if cache < 16 { + cache = 16 + } + glog.V(logger.Info).Infof("Alloted %dMB cache to %s", cache, file) + + // Open the db and recover any potential corruptions + db, err := leveldb.OpenFile(file, &opt.Options{ + OpenFilesCacheCapacity: OpenFileLimit, + BlockCacheCapacity: cache / 2 * opt.MiB, + WriteBuffer: cache / 4 * opt.MiB, // Two of these are used internally + }) + if _, corrupted := err.(*errors.ErrCorrupted); corrupted { db, err = leveldb.RecoverFile(file, nil) } - // (re) check for errors and abort if opening of the db failed + // (Re)check for errors and abort if opening of the db failed if err != nil { return nil, err } diff --git a/ethdb/database_test.go b/ethdb/database_test.go index 29292d016..41947a698 100644 --- a/ethdb/database_test.go +++ b/ethdb/database_test.go @@ -28,8 +28,7 @@ func newDb() *LDBDatabase { if common.FileExist(file) { os.RemoveAll(file) } - - db, _ := NewLDBDatabase(file) + db, _ := NewLDBDatabase(file, 0) return db } |