@@ -35,6 +35,8 @@ namespace {
3535
3636class RoundRobinBlobFilePartitionStrategy : public BlobFilePartitionStrategy {
3737 public:
38+ using BlobFilePartitionStrategy::SelectPartition;
39+
3840 const char * Name () const override {
3941 return " RoundRobinBlobFilePartitionStrategy" ;
4042 }
@@ -408,11 +410,19 @@ Status BlobFilePartitionManager::MaybePrepopulateBlobCache(
408410 CacheTier::kVolatileTier );
409411}
410412
413+ uint32_t BlobFilePartitionManager::SelectWideColumnPartition (
414+ uint32_t column_family_id, const Slice& key,
415+ const WideColumns& columns) const {
416+ return strategy_->SelectPartition (num_partitions_, column_family_id, key,
417+ columns) %
418+ num_partitions_;
419+ }
420+
411421Status BlobFilePartitionManager::WriteBlob (
412422 const WriteOptions& write_options, uint32_t column_family_id,
413423 CompressionType compression, const Slice& key, const Slice& value,
414424 uint64_t * blob_file_number, uint64_t * blob_offset, uint64_t * blob_size,
415- const BlobDirectWriteSettings* settings) {
425+ const BlobDirectWriteSettings* settings, const uint32_t * partition_idx ) {
416426 assert (blob_file_number != nullptr );
417427 assert (blob_offset != nullptr );
418428 assert (blob_size != nullptr );
@@ -443,14 +453,16 @@ Status BlobFilePartitionManager::WriteBlob(
443453 // uncompressed value rather than `write_value`. The modulo here is
444454 // intentional so custom strategies can return arbitrary hashed or sentinel
445455 // values without violating the partition bounds.
446- const uint32_t partition_idx =
447- strategy_->SelectPartition (num_partitions_, column_family_id, key,
448- value) %
449- num_partitions_;
456+ const uint32_t selected_partition_idx =
457+ partition_idx != nullptr
458+ ? (*partition_idx % num_partitions_)
459+ : (strategy_->SelectPartition (num_partitions_, column_family_id, key,
460+ value) %
461+ num_partitions_);
450462
451463 {
452464 MutexLock lock (&mutex_);
453- Partition* partition = partitions_[partition_idx ].get ();
465+ Partition* partition = partitions_[selected_partition_idx ].get ();
454466
455467 auto seal_current_file = [&]() -> Status {
456468 if (!partition->writer ) {
@@ -481,7 +493,7 @@ Status BlobFilePartitionManager::WriteBlob(
481493
482494 if (!partition->writer ) {
483495 Status s = OpenNewBlobFile (partition, column_family_id, compression,
484- partition_idx );
496+ selected_partition_idx );
485497 if (!s.ok ()) {
486498 return s;
487499 }
@@ -681,6 +693,14 @@ void BlobFilePartitionManager::GetProtectedBlobFileNumbers(
681693 }
682694}
683695
696+ bool BlobFilePartitionManager::IsTrackedBlobFileNumber (
697+ uint64_t file_number) const {
698+ ReadLock lock (&file_partition_mutex_);
699+ return file_to_partition_.find (file_number) != file_to_partition_.end () ||
700+ protected_blob_file_refs_.find (file_number) !=
701+ protected_blob_file_refs_.end ();
702+ }
703+
684704void BlobFilePartitionManager::ProtectSealedBlobFileNumbers (
685705 const std::vector<uint64_t >& file_numbers) {
686706 if (file_numbers.empty ()) {
@@ -747,12 +767,10 @@ void BlobFilePartitionManager::RemoveFilePartitionMappings(
747767Status BlobFilePartitionManager::ResolveBlobDirectWriteIndex (
748768 const ReadOptions& read_options, const Slice& user_key,
749769 const BlobIndex& blob_idx, const Version* version,
750- BlobFileCache* blob_file_cache, PinnableSlice* blob_value) {
770+ BlobFileCache* blob_file_cache, FilePrefetchBuffer* prefetch_buffer,
771+ PinnableSlice* blob_value, uint64_t * bytes_read) {
751772 assert (blob_value != nullptr );
752773
753- constexpr FilePrefetchBuffer* prefetch_buffer = nullptr ;
754- constexpr uint64_t * bytes_read = nullptr ;
755-
756774 if (version != nullptr ) {
757775 // Only fall back when the blob file is still owned exclusively by the
758776 // write path and therefore absent from Version metadata. Once Version
0 commit comments