Summary: simply move BlobFile definition from blob_db_impl.h to blob_file.h. Closes https://github.com/facebook/rocksdb/pull/3002 Differential Revision: D6050143 Pulled By: yiwu-arbug fbshipit-source-id: a8fb6e094fe39bdeace6279569834bc65aa64a34main
parent
31d3e41810
commit
10ba50e9eb
@ -0,0 +1,187 @@ |
||||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
||||
// This source code is licensed under both the GPLv2 (found in the
|
||||
// COPYING file in the root directory) and Apache 2.0 License
|
||||
// (found in the LICENSE.Apache file in the root directory).
|
||||
#pragma once |
||||
#ifndef ROCKSDB_LITE |
||||
|
||||
#include <atomic> |
||||
#include <memory> |
||||
|
||||
#include "port/port.h" |
||||
#include "rocksdb/env.h" |
||||
#include "rocksdb/options.h" |
||||
#include "util/file_reader_writer.h" |
||||
#include "utilities/blob_db/blob_log_format.h" |
||||
#include "utilities/blob_db/blob_log_writer.h" |
||||
|
||||
namespace rocksdb { |
||||
namespace blob_db { |
||||
|
||||
class BlobFile { |
||||
friend class BlobDBImpl; |
||||
friend struct blobf_compare_ttl; |
||||
|
||||
private: |
||||
// access to parent
|
||||
const BlobDBImpl* parent_; |
||||
|
||||
// path to blob directory
|
||||
std::string path_to_dir_; |
||||
|
||||
// the id of the file.
|
||||
// the above 2 are created during file creation and never changed
|
||||
// after that
|
||||
uint64_t file_number_; |
||||
|
||||
// number of blobs in the file
|
||||
std::atomic<uint64_t> blob_count_; |
||||
|
||||
// the file will be selected for GC in this future epoch
|
||||
std::atomic<int64_t> gc_epoch_; |
||||
|
||||
// size of the file
|
||||
std::atomic<uint64_t> file_size_; |
||||
|
||||
// number of blobs in this particular file which have been evicted
|
||||
uint64_t deleted_count_; |
||||
|
||||
// size of deleted blobs (used by heuristic to select file for GC)
|
||||
uint64_t deleted_size_; |
||||
|
||||
BlobLogHeader header_; |
||||
|
||||
// closed_ = true implies the file is no more mutable
|
||||
// no more blobs will be appended and the footer has been written out
|
||||
std::atomic<bool> closed_; |
||||
|
||||
// has a pass of garbage collection successfully finished on this file
|
||||
// can_be_deleted_ still needs to do iterator/snapshot checks
|
||||
std::atomic<bool> can_be_deleted_; |
||||
|
||||
// should this file been gc'd once to reconcile lost deletes/compactions
|
||||
std::atomic<bool> gc_once_after_open_; |
||||
|
||||
// et - lt of the blobs
|
||||
ttlrange_t ttl_range_; |
||||
|
||||
// et - lt of the timestamp of the KV pairs.
|
||||
tsrange_t time_range_; |
||||
|
||||
// ESN - LSN of the blobs
|
||||
snrange_t sn_range_; |
||||
|
||||
// Sequential/Append writer for blobs
|
||||
std::shared_ptr<Writer> log_writer_; |
||||
|
||||
// random access file reader for GET calls
|
||||
std::shared_ptr<RandomAccessFileReader> ra_file_reader_; |
||||
|
||||
// This Read-Write mutex is per file specific and protects
|
||||
// all the datastructures
|
||||
mutable port::RWMutex mutex_; |
||||
|
||||
// time when the random access reader was last created.
|
||||
std::atomic<std::int64_t> last_access_; |
||||
|
||||
// last time file was fsync'd/fdatasyncd
|
||||
std::atomic<uint64_t> last_fsync_; |
||||
|
||||
bool header_valid_; |
||||
|
||||
public: |
||||
BlobFile(); |
||||
|
||||
BlobFile(const BlobDBImpl* parent, const std::string& bdir, uint64_t fnum); |
||||
|
||||
~BlobFile(); |
||||
|
||||
ColumnFamilyHandle* GetColumnFamily(DB* db); |
||||
|
||||
// Returns log file's pathname relative to the main db dir
|
||||
// Eg. For a live-log-file = blob_dir/000003.blob
|
||||
std::string PathName() const; |
||||
|
||||
// Primary identifier for blob file.
|
||||
// once the file is created, this never changes
|
||||
uint64_t BlobFileNumber() const { return file_number_; } |
||||
|
||||
// the following functions are atomic, and don't need
|
||||
// read lock
|
||||
uint64_t BlobCount() const { |
||||
return blob_count_.load(std::memory_order_acquire); |
||||
} |
||||
|
||||
std::string DumpState() const; |
||||
|
||||
// if the file has gone through GC and blobs have been relocated
|
||||
bool Obsolete() const { return can_be_deleted_.load(); } |
||||
|
||||
// if the file is not taking any more appends.
|
||||
bool Immutable() const { return closed_.load(); } |
||||
|
||||
// we will assume this is atomic
|
||||
bool NeedsFsync(bool hard, uint64_t bytes_per_sync) const; |
||||
|
||||
uint64_t GetFileSize() const { |
||||
return file_size_.load(std::memory_order_acquire); |
||||
} |
||||
|
||||
// All Get functions which are not atomic, will need ReadLock on the mutex
|
||||
tsrange_t GetTimeRange() const { |
||||
assert(HasTimestamp()); |
||||
return time_range_; |
||||
} |
||||
|
||||
ttlrange_t GetTTLRange() const { return ttl_range_; } |
||||
|
||||
snrange_t GetSNRange() const { return sn_range_; } |
||||
|
||||
bool HasTTL() const { |
||||
assert(header_valid_); |
||||
return header_.HasTTL(); |
||||
} |
||||
|
||||
bool HasTimestamp() const { |
||||
assert(header_valid_); |
||||
return header_.HasTimestamp(); |
||||
} |
||||
|
||||
std::shared_ptr<Writer> GetWriter() const { return log_writer_; } |
||||
|
||||
void Fsync(); |
||||
|
||||
private: |
||||
std::shared_ptr<Reader> OpenSequentialReader( |
||||
Env* env, const DBOptions& db_options, |
||||
const EnvOptions& env_options) const; |
||||
|
||||
Status ReadFooter(BlobLogFooter* footer); |
||||
|
||||
Status WriteFooterAndCloseLocked(); |
||||
|
||||
std::shared_ptr<RandomAccessFileReader> GetOrOpenRandomAccessReader( |
||||
Env* env, const EnvOptions& env_options, bool* fresh_open); |
||||
|
||||
void CloseRandomAccessLocked(); |
||||
|
||||
// this is used, when you are reading only the footer of a
|
||||
// previously closed file
|
||||
Status SetFromFooterLocked(const BlobLogFooter& footer); |
||||
|
||||
void set_time_range(const tsrange_t& tr) { time_range_ = tr; } |
||||
|
||||
void set_ttl_range(const ttlrange_t& ttl) { ttl_range_ = ttl; } |
||||
|
||||
void SetSNRange(const snrange_t& snr) { sn_range_ = snr; } |
||||
|
||||
// The following functions are atomic, and don't need locks
|
||||
void SetFileSize(uint64_t fs) { file_size_ = fs; } |
||||
|
||||
void SetBlobCount(uint64_t bc) { blob_count_ = bc; } |
||||
|
||||
void SetCanBeDeleted() { can_be_deleted_ = true; } |
||||
}; |
||||
} // namespace blob_db
|
||||
} // namespace rocksdb
|
||||
#endif // ROCKSDB_LITE
|
Loading…
Reference in new issue