github.com/zuoyebang/bitalosdb@v1.1.1-0.20240516111551-79a8c4d8ce20/bitpage/flushable.go (about)

     1  // Copyright 2021 The Bitalosdb author(hustxrb@163.com) and other contributors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package bitpage
    16  
    17  import (
    18  	"fmt"
    19  	"sync/atomic"
    20  )
    21  
    22  type flushable interface {
    23  	get([]byte, uint32) ([]byte, bool, internalKeyKind, func())
    24  	newIter(*iterOptions) internalIterator
    25  	delPercent() float64
    26  	itemCount() int
    27  	inuseBytes() uint64
    28  	dataBytes() uint64
    29  	readyForFlush() bool
    30  	close() error
    31  	path() string
    32  	idxFilePath() string
    33  	empty() bool
    34  }
    35  
    36  type flushableEntry struct {
    37  	flushable
    38  	obsolete   bool
    39  	fileNum    FileNum
    40  	readerRefs atomic.Int32
    41  	release    func()
    42  }
    43  
    44  func (e *flushableEntry) readerRef() {
    45  	e.readerRefs.Add(1)
    46  }
    47  
    48  func (e *flushableEntry) readerUnref() {
    49  	switch v := e.readerRefs.Add(-1); {
    50  	case v < 0:
    51  		fmt.Printf("bitpage: inconsistent reference path:%s count:%d\n", e.path(), v)
    52  	case v == 0:
    53  		if e.release != nil {
    54  			e.release()
    55  			e.release = nil
    56  		}
    57  	}
    58  }
    59  
    60  func (e *flushableEntry) setObsolete() {
    61  	e.obsolete = true
    62  }
    63  
    64  type flushableList []*flushableEntry