Fix mmap step & max size check.

This commit adds fixes suggested by @tv42 for the mmap step fix in 834b38e:

* Check max size before calculating the new the mmap size.
* Fix mmap step loop to go to 1GB instead of 512MB.
master
Ben Johnson 2015-01-28 13:03:30 -05:00
parent 4e3fb8d60b
commit dacc1873d1
1 changed files with 13 additions and 9 deletions

22
db.go
View File

@ -171,11 +171,9 @@ func (db *DB) mmap(minsz int) error {
if size < minsz {
size = minsz
}
size = db.mmapSize(size)
// Verify the map size is not above the maximum allowed.
if size > maxMapSize {
return fmt.Errorf("mmap too large")
size, err = db.mmapSize(size)
if err != nil {
return err
}
// Dereference all mmap references before unmapping.
@ -218,14 +216,20 @@ func (db *DB) munmap() error {
// mmapSize determines the appropriate size for the mmap given the current size
// of the database. The minimum size is 4MB and doubles until it reaches 1GB.
func (db *DB) mmapSize(size int) int {
// Returns an error if the new mmap size is greater than the max allowed.
func (db *DB) mmapSize(size int) (int, error) {
// Double the size from 1MB until 1GB.
for i := uint(20); i < 30; i++ {
for i := uint(20); i <= 30; i++ {
if size <= 1<<i {
return 1 << i
return 1 << i, nil
}
}
// Verify the map size is not above the maximum allowed.
if size > maxMapSize-maxMmapStep {
return 0, fmt.Errorf("mmap too large")
}
// If larger than 1GB then grow by 1GB at a time.
size += maxMmapStep
if remainder := size % maxMmapStep; remainder > 0 {
@ -238,7 +242,7 @@ func (db *DB) mmapSize(size int) int {
size = ((size / db.pageSize) + 1) * db.pageSize
}
return size
return size, nil
}
// init creates a new database file and initializes its meta pages.