Upgrade versions of vendored libs

This commit is contained in:
eleksir
2023-06-14 01:06:17 +03:00
parent 37898d3013
commit 747ff1454e
120 changed files with 5126 additions and 1245 deletions

View File

@@ -9,6 +9,7 @@ import (
"context"
"fmt"
"io"
"math"
"runtime/debug"
"runtime/pprof"
"sync"
@@ -21,6 +22,7 @@ import (
"github.com/cockroachdb/pebble/internal/keyspan"
"github.com/cockroachdb/pebble/internal/manifest"
"github.com/cockroachdb/pebble/internal/private"
"github.com/cockroachdb/pebble/internal/rangekey"
"github.com/cockroachdb/pebble/objstorage"
"github.com/cockroachdb/pebble/objstorage/objstorageprovider/objiotracing"
"github.com/cockroachdb/pebble/sstable"
@@ -138,7 +140,7 @@ func (c *tableCacheContainer) newIters(
}
func (c *tableCacheContainer) newRangeKeyIter(
file *manifest.FileMetadata, opts *keyspan.SpanIterOptions,
file *manifest.FileMetadata, opts keyspan.SpanIterOptions,
) (keyspan.FragmentIterator, error) {
return c.tableCache.getShard(file.FileBacking.DiskFileNum).newRangeKeyIter(file, opts, &c.dbOpts)
}
@@ -168,6 +170,32 @@ func (c *tableCacheContainer) metrics() (CacheMetrics, FilterMetrics) {
return m, f
}
func (c *tableCacheContainer) estimateSize(
meta *fileMetadata, lower, upper []byte,
) (size uint64, err error) {
if meta.Virtual {
err = c.withVirtualReader(
meta.VirtualMeta(),
func(r sstable.VirtualReader) (err error) {
size, err = r.EstimateDiskUsage(lower, upper)
return err
},
)
} else {
err = c.withReader(
meta.PhysicalMeta(),
func(r *sstable.Reader) (err error) {
size, err = r.EstimateDiskUsage(lower, upper)
return err
},
)
}
if err != nil {
return 0, err
}
return size, nil
}
func (c *tableCacheContainer) withReader(meta physicalMeta, fn func(*sstable.Reader) error) error {
s := c.tableCache.getShard(meta.FileBacking.DiskFileNum)
v := s.findNode(meta.FileMetadata, &c.dbOpts)
@@ -373,6 +401,26 @@ func (c *tableCacheShard) newIters(
return nil, nil, v.err
}
hideObsoletePoints := false
if opts != nil {
// This code is appending (at most one filter) in-place to
// opts.PointKeyFilters even though the slice is shared for iterators in
// the same iterator tree. This is acceptable since all the following
// properties are true:
// - The iterator tree is single threaded, so the shared backing for the
// slice is being mutated in a single threaded manner.
// - Each shallow copy of the slice has its own notion of length.
// - The appended element is always the obsoleteKeyBlockPropertyFilter
// struct, which is stateless, so overwriting that struct when creating
// one sstable iterator is harmless to other sstable iterators that are
// relying on that struct.
//
// An alternative would be to have different slices for different sstable
// iterators, but that requires more work to avoid allocations.
hideObsoletePoints, opts.PointKeyFilters =
v.reader.TryAddBlockPropertyFilterForHideObsoletePoints(
opts.snapshotForHideObsoletePoints, file.LargestSeqNum, opts.PointKeyFilters)
}
ok := true
var filterer *sstable.BlockPropertiesFilterer
var err error
@@ -387,14 +435,7 @@ func (c *tableCacheShard) newIters(
type iterCreator interface {
NewRawRangeDelIter() (keyspan.FragmentIterator, error)
NewIterWithBlockPropertyFiltersAndContext(
ctx context.Context,
lower, upper []byte,
filterer *sstable.BlockPropertiesFilterer,
useFilterBlock bool,
stats *base.InternalIteratorStats,
rp sstable.ReaderProvider,
) (sstable.Iterator, error)
NewIterWithBlockPropertyFiltersAndContextEtc(ctx context.Context, lower, upper []byte, filterer *sstable.BlockPropertiesFilterer, hideObsoletePoints, useFilterBlock bool, stats *base.InternalIteratorStats, rp sstable.ReaderProvider) (sstable.Iterator, error)
NewCompactionIter(
bytesIterated *uint64,
rp sstable.ReaderProvider,
@@ -410,11 +451,38 @@ func (c *tableCacheShard) newIters(
ic = &virtualReader
}
provider := dbOpts.objProvider
// Check if this file is a foreign file.
objMeta, err := provider.Lookup(fileTypeTable, file.FileBacking.DiskFileNum)
if err != nil {
return nil, nil, err
}
// NB: range-del iterator does not maintain a reference to the table, nor
// does it need to read from it after creation.
var rangeDelIter keyspan.FragmentIterator
rangeDelIter, err = ic.NewRawRangeDelIter()
if provider.IsForeign(objMeta) {
if opts == nil {
panic("unexpected nil opts when reading foreign file")
}
if !file.Virtual {
// Foreign sstables must be virtual by definition.
panic(fmt.Sprintf("sstable is foreign but not virtual: %s", file.FileNum))
}
switch manifest.LevelToInt(opts.level) {
case 5:
rangeDelIter, err = ic.NewRawRangeDelIter()
case 6:
// Let rangeDelIter remain nil. We don't need to return rangedels from
// this file as they will not apply to any other files. For the purpose
// of collapsing rangedels within this file, we create another rangeDelIter
// below for use with the interleaving iter.
default:
panic(fmt.Sprintf("unexpected level for foreign sstable: %d", manifest.LevelToInt(opts.level)))
}
} else {
rangeDelIter, err = ic.NewRawRangeDelIter()
}
if err != nil {
c.unrefValue(v)
return nil, nil, err
@@ -454,11 +522,9 @@ func (c *tableCacheShard) newIters(
if internalOpts.bytesIterated != nil {
iter, err = ic.NewCompactionIter(internalOpts.bytesIterated, rp)
} else {
iter, err = ic.NewIterWithBlockPropertyFiltersAndContext(
ctx,
opts.GetLowerBound(), opts.GetUpperBound(),
filterer, useFilter, internalOpts.stats, rp,
)
iter, err = ic.NewIterWithBlockPropertyFiltersAndContextEtc(
ctx, opts.GetLowerBound(), opts.GetUpperBound(), filterer, hideObsoletePoints, useFilter,
internalOpts.stats, rp)
}
if err != nil {
if rangeDelIter != nil {
@@ -470,6 +536,35 @@ func (c *tableCacheShard) newIters(
// NB: v.closeHook takes responsibility for calling unrefValue(v) here. Take
// care to avoid introducing an allocation here by adding a closure.
iter.SetCloseHook(v.closeHook)
if provider.IsForeign(objMeta) {
// NB: IsForeign() guarantees IsShared, so opts must not be nil as we've
// already panicked on the nil case above.
pointKeySeqNum := base.SeqNumForLevel(manifest.LevelToInt(opts.level))
pcIter := pointCollapsingIterator{
comparer: dbOpts.opts.Comparer,
merge: dbOpts.opts.Merge,
seqNum: math.MaxUint64,
elideRangeDeletes: true,
fixedSeqNum: pointKeySeqNum,
}
// Open a second rangedel iter. This is solely for the interleaving iter to
// be able to efficiently delete covered range deletes. We don't need to fix
// the sequence number in this iter, as these range deletes will not be
// exposed to anything other than the interleaving iter and
// pointCollapsingIter.
rangeDelIter, err := v.reader.NewRawRangeDelIter()
if err != nil {
c.unrefValue(v)
return nil, nil, err
}
if rangeDelIter == nil {
rangeDelIter = emptyKeyspanIter
}
pcIter.iter.Init(dbOpts.opts.Comparer, iter, rangeDelIter, nil /* mask */, opts.LowerBound, opts.UpperBound)
pcSSTIter := pcSSTIterPool.Get().(*pointCollapsingSSTIterator)
*pcSSTIter = pointCollapsingSSTIterator{pointCollapsingIterator: pcIter, childIter: iter}
iter = pcSSTIter
}
c.iterCount.Add(1)
dbOpts.iterCount.Add(1)
@@ -482,7 +577,7 @@ func (c *tableCacheShard) newIters(
}
func (c *tableCacheShard) newRangeKeyIter(
file *manifest.FileMetadata, opts *keyspan.SpanIterOptions, dbOpts *tableCacheOpts,
file *manifest.FileMetadata, opts keyspan.SpanIterOptions, dbOpts *tableCacheOpts,
) (keyspan.FragmentIterator, error) {
// Calling findNode gives us the responsibility of decrementing v's
// refCount. If opening the underlying table resulted in error, then we
@@ -501,7 +596,7 @@ func (c *tableCacheShard) newRangeKeyIter(
// file's range key blocks may surface deleted range keys below. This is
// done here, rather than deferring to the block-property collector in order
// to maintain parity with point keys and the treatment of RANGEDELs.
if opts != nil && v.reader.Properties.NumRangeKeyDels == 0 {
if v.reader.Properties.NumRangeKeyDels == 0 {
ok, _, err = c.checkAndIntersectFilters(v, nil, opts.RangeKeyFilters, nil)
}
if err != nil {
@@ -539,6 +634,29 @@ func (c *tableCacheShard) newRangeKeyIter(
return emptyKeyspanIter, nil
}
objMeta, err := dbOpts.objProvider.Lookup(fileTypeTable, file.FileBacking.DiskFileNum)
if err != nil {
return nil, err
}
if dbOpts.objProvider.IsForeign(objMeta) {
if opts.Level == 0 {
panic("unexpected zero level when reading foreign file")
}
transform := &rangekey.ForeignSSTTransformer{
Comparer: dbOpts.opts.Comparer,
Level: manifest.LevelToInt(opts.Level),
}
if iter == nil {
iter = emptyKeyspanIter
}
transformIter := &keyspan.TransformerIter{
FragmentIterator: iter,
Transformer: transform,
Compare: dbOpts.opts.Comparer.Compare,
}
return transformIter, nil
}
return iter, nil
}
@@ -986,9 +1104,16 @@ type loadInfo struct {
func (v *tableCacheValue) load(loadInfo loadInfo, c *tableCacheShard, dbOpts *tableCacheOpts) {
// Try opening the file first.
var f objstorage.Readable
f, v.err = dbOpts.objProvider.OpenForReading(
var err error
f, err = dbOpts.objProvider.OpenForReading(
context.TODO(), fileTypeTable, loadInfo.backingFileNum, objstorage.OpenOptions{MustExist: true},
)
if err != nil {
v.err = errors.Wrap(
err,
fmt.Sprintf("pebble: could not open backing file %s", errors.Safe(loadInfo.backingFileNum.FileNum())),
)
}
if v.err == nil {
cacheOpts := private.SSTableCacheOpts(dbOpts.cacheID, loadInfo.backingFileNum).(sstable.ReaderOption)
v.reader, v.err = sstable.NewReader(f, dbOpts.opts, cacheOpts, dbOpts.filterMetrics)