mirror of https://github.com/hak5/bolt.git
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
parent
4e3fb8d60b
commit
dacc1873d1
22
db.go
22
db.go
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue