// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
-// This source code is licensed under the BSD-style license found in the
-// LICENSE file in the root directory of this source tree. An additional grant
-// of patent rights can be found in the PATENTS file in the same directory.
+// 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
#include <string>
uint64_t file_size;
// total number of keys in external file
uint64_t num_entries;
+ // total number of range deletions in external file
+ uint64_t num_range_deletions;
// Id of column family this file shoule be ingested into
uint32_t cf_id;
// TableProperties read from external file
// FileDescriptor for the file inside the DB
FileDescriptor fd;
// file path that we picked for file inside the DB
- std::string internal_file_path = "";
+ std::string internal_file_path;
// Global sequence number that we picked for the file inside the DB
SequenceNumber assigned_seqno = 0;
// Level inside the DB we picked for the external file.
int picked_level = 0;
+ // Whether to copy or link the external sst file. copy_file will be set to
+ // false if ingestion_options.move_files is true and underlying FS
+ // supports link operation. Need to provide a default value to make the
+ // undefined-behavior sanity check of llvm happy. Since
+ // ingestion_options.move_files is false by default, thus copy_file is true
+ // by default.
+ bool copy_file = true;
InternalKey smallest_internal_key() const {
return InternalKey(smallest_user_key, assigned_seqno,
job_start_time_(env_->NowMicros()) {}
// Prepare the job by copying external files into the DB.
- Status Prepare(const std::vector<std::string>& external_files_paths);
+ Status Prepare(const std::vector<std::string>& external_files_paths,
+ uint64_t next_file_number, SuperVersion* sv);
// Check if we need to flush the memtable before running the ingestion job
// This will be true if the files we are ingesting are overlapping with any
// key range in the memtable.
- // REQUIRES: Mutex held
- Status NeedsFlush(bool* flush_needed);
+ //
+ // @param super_version A referenced SuperVersion that will be held for the
+ // duration of this function.
+ //
+ // Thread-safe
+ Status NeedsFlush(bool* flush_needed, SuperVersion* super_version);
// Will execute the ingestion job and prepare edit() to be applied.
// REQUIRES: Mutex held
// REQUIRES: Mutex held
void UpdateStats();
- // Cleanup after successfull/failed job
+ // Cleanup after successful/failed job
void Cleanup(const Status& status);
VersionEdit* edit() { return &edit_; }
// Open the external file and populate `file_to_ingest` with all the
// external information we need to ingest this file.
Status GetIngestedFileInfo(const std::string& external_file,
- IngestedFileInfo* file_to_ingest);
-
- // Check if the files we are ingesting overlap with any memtable.
- // REQUIRES: Mutex held
- Status IngestedFilesOverlapWithMemtables(SuperVersion* sv, bool* overlap);
+ IngestedFileInfo* file_to_ingest,
+ SuperVersion* sv);
// Assign `file_to_ingest` the appropriate sequence number and the lowest
// possible level that it can be ingested to according to compaction_style.
IngestedFileInfo* file_to_ingest,
SequenceNumber* assigned_seqno);
+ // File that we want to ingest behind always goes to the lowest level;
+ // we just check that it fits in the level, that DB allows ingest_behind,
+ // and that we don't have 0 seqnums at the upper levels.
+ // REQUIRES: Mutex held
+ Status CheckLevelForIngestedBehindFile(IngestedFileInfo* file_to_ingest);
+
// Set the file global sequence number to `seqno`
Status AssignGlobalSeqnoForIngestedFile(IngestedFileInfo* file_to_ingest,
SequenceNumber seqno);
- // Check if `file_to_ingest` key range overlap with the range `iter` represent
- // REQUIRES: Mutex held
- Status IngestedFileOverlapWithIteratorRange(
- const IngestedFileInfo* file_to_ingest, InternalIterator* iter,
- bool* overlap);
-
// Check if `file_to_ingest` can fit in level `level`
// REQUIRES: Mutex held
bool IngestedFileFitInLevel(const IngestedFileInfo* file_to_ingest,