Skip to content

loadSegment l.scache.Range: return false should be in if statement #24

@ZhangDongling

Description

@ZhangDongling

the original code:

wal/wal.go

Line 600 in e70ddec

return false

func (l *Log) loadSegment(index uint64) (*segment, error) {
	...
	// check the most recent cached segment
	var rseg *segment
	l.scache.Range(func(_, v interface{}) bool {
		s := v.(*segment)
		if index >= s.index && index < s.index+uint64(len(s.epos)) {
			rseg = s
		}
		return false
	})
        ...
}

lru.Range is like this:

func (lru *LRU) Range(iter func(key interface{}, value interface{}) bool) {
	lru.mu.RLock()
	defer lru.mu.RUnlock()
	if head := lru.head; head != nil {
		item := head.next
		for item != lru.tail {
			if !iter(item.key, item.value) {
				return
			}
			item = item.next
		}
	}
}

when the iter returns false, Range will stop iterating and return;

so, in loadSegment, Range should be called like this:

func (l *Log) loadSegment(index uint64) (*segment, error) {
	...
	// check the most recent cached segment
	var rseg *segment
	l.scache.Range(func(_, v interface{}) bool {
		s := v.(*segment)
		if index >= s.index && index < s.index+uint64(len(s.epos)) {
			rseg = s
			return false
		}
		return true
	})
        ...
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions