diff --git a/weed/storage/needle/compact_map.go b/weed/storage/needle/compact_map.go index 2182f3bf3..4816e0098 100644 --- a/weed/storage/needle/compact_map.go +++ b/weed/storage/needle/compact_map.go @@ -165,19 +165,29 @@ func (cm *CompactMap) Get(key NeedleId) (*NeedleValue, bool) { return cm.list[x].Get(key) } func (cm *CompactMap) binarySearchCompactSection(key NeedleId) int { - if len(cm.list) == 0 { - return -1 + l, h := 0, len(cm.list)-1 + if h < 0 { + return -5 } - x := sort.Search(len(cm.list), func(i int) bool { - return cm.list[i].start >= key - }) - if len(cm.list) == x { - return -1 + if cm.list[h].start <= key { + if cm.list[h].counter < batch || key <= cm.list[h].end { + return h + } + return -4 } - if cm.list[x].start == key { - return x + for l <= h { + m := (l + h) / 2 + if key < cm.list[m].start { + h = m - 1 + } else { // cm.list[m].start <= key + if cm.list[m+1].start <= key { + l = m + 1 + } else { + return m + } + } } - return x - 1 + return -3 } // Visit visits all entries or stop if any error when visiting