github.com/cockroachdb/pebble@v1.1.1-0.20240513155919-3622ade60459/objstorage/objstorageprovider/remote_obj_name.go (about)

     1  // Copyright 2023 The LevelDB-Go and Pebble Authors. All rights reserved. Use
     2  // of this source code is governed by a BSD-style license that can be found in
     3  // the LICENSE file.
     4  
     5  package objstorageprovider
     6  
     7  import (
     8  	"fmt"
     9  
    10  	"github.com/cockroachdb/pebble/internal/base"
    11  	"github.com/cockroachdb/pebble/objstorage"
    12  )
    13  
    14  // remoteObjectName returns the name of an object on remote storage.
    15  //
    16  // For sstables, the format is: <hash>-<creator-id>-<file-num>.sst
    17  // For example: 1a3f-2-000001.sst
    18  func remoteObjectName(meta objstorage.ObjectMetadata) string {
    19  	if meta.Remote.CustomObjectName != "" {
    20  		return meta.Remote.CustomObjectName
    21  	}
    22  	switch meta.FileType {
    23  	case base.FileTypeTable:
    24  		return fmt.Sprintf(
    25  			"%04x-%d-%06d.sst",
    26  			objHash(meta), meta.Remote.CreatorID, meta.Remote.CreatorFileNum.FileNum(),
    27  		)
    28  	}
    29  	panic("unknown FileType")
    30  }
    31  
    32  // sharedObjectRefName returns the name of the object's ref marker associated
    33  // with a given referencing provider. This name is the object's name concatenated with
    34  // ".ref.<ref-creator-id>.<local-file-num>".
    35  //
    36  // For example: 1a3f-2-000001.sst.ref.5.000008
    37  func sharedObjectRefName(
    38  	meta objstorage.ObjectMetadata, refCreatorID objstorage.CreatorID, refFileNum base.DiskFileNum,
    39  ) string {
    40  	if meta.Remote.CleanupMethod != objstorage.SharedRefTracking {
    41  		panic("ref object used when ref tracking disabled")
    42  	}
    43  	if meta.Remote.CustomObjectName != "" {
    44  		return fmt.Sprintf(
    45  			"%s.ref.%d.%06d", meta.Remote.CustomObjectName, refCreatorID, refFileNum.FileNum(),
    46  		)
    47  	}
    48  	switch meta.FileType {
    49  	case base.FileTypeTable:
    50  		return fmt.Sprintf(
    51  			"%04x-%d-%06d.sst.ref.%d.%06d",
    52  			objHash(meta), meta.Remote.CreatorID, meta.Remote.CreatorFileNum.FileNum(), refCreatorID, refFileNum.FileNum(),
    53  		)
    54  	}
    55  	panic("unknown FileType")
    56  }
    57  
    58  func sharedObjectRefPrefix(meta objstorage.ObjectMetadata) string {
    59  	if meta.Remote.CustomObjectName != "" {
    60  		return meta.Remote.CustomObjectName + ".ref."
    61  	}
    62  	switch meta.FileType {
    63  	case base.FileTypeTable:
    64  		return fmt.Sprintf(
    65  			"%04x-%d-%06d.sst.ref.",
    66  			objHash(meta), meta.Remote.CreatorID, meta.Remote.CreatorFileNum.FileNum(),
    67  		)
    68  	}
    69  	panic("unknown FileType")
    70  }
    71  
    72  // sharedObjectRefName returns the name of the object's ref marker associated
    73  // with this provider. This name is the object's name concatenated with
    74  // ".ref.<creator-id>.<local-file-num>".
    75  //
    76  // For example: 1a3f-2-000001.sst.ref.5.000008
    77  func (p *provider) sharedObjectRefName(meta objstorage.ObjectMetadata) string {
    78  	if meta.Remote.CleanupMethod != objstorage.SharedRefTracking {
    79  		panic("ref object used when ref tracking disabled")
    80  	}
    81  	return sharedObjectRefName(meta, p.remote.shared.creatorID, meta.DiskFileNum)
    82  }
    83  
    84  // objHash returns a 16-bit hash value derived from the creator ID and creator
    85  // file num. We prepend this value to object names to ensure balanced
    86  // partitioning with AWS (and likely other blob storage providers).
    87  func objHash(meta objstorage.ObjectMetadata) uint16 {
    88  	const prime1 = 7459
    89  	const prime2 = 17539
    90  	return uint16(uint64(meta.Remote.CreatorID)*prime1 + uint64(meta.Remote.CreatorFileNum.FileNum())*prime2)
    91  }