Revision 4420df4b0e15ae88911e960c4fbafbaf8450fcf7 authored by Andrew Kryczka on 05 June 2018, 21:03:42 UTC, committed by Facebook Github Bot on 05 June 2018, 21:14:05 UTC
Summary:
CompactFiles checked whether the existing files conflicted with the chosen compaction. But it missed checking whether future files would conflict, i.e., when another compaction was simultaneously writing new files to the same range at the same output level.
Closes https://github.com/facebook/rocksdb/pull/3926

Differential Revision: D8218996

Pulled By: ajkr

fbshipit-source-id: 21cb00a6fed4c8c62d3ed2ff810962e6bdc2fdfb
1 parent f1592a0
Raw File
snapshot_checker.h
// 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
#include "rocksdb/types.h"

namespace rocksdb {

// Callback class that control GC of duplicate keys in flush/compaction
class SnapshotChecker {
 public:
  virtual ~SnapshotChecker() {}
  virtual bool IsInSnapshot(SequenceNumber sequence,
                            SequenceNumber snapshot_sequence) const = 0;
};

class DisableGCSnapshotChecker : public SnapshotChecker {
 public:
  virtual ~DisableGCSnapshotChecker() {}
  virtual bool IsInSnapshot(SequenceNumber /*sequence*/,
                            SequenceNumber /*snapshot_sequence*/) const {
    // By returning false, we prevent all the values from being GCed
    return false;
  }
  static DisableGCSnapshotChecker* Instance() { return &instance_; }

 protected:
  static DisableGCSnapshotChecker instance_;
  explicit DisableGCSnapshotChecker() {}
};

class WritePreparedTxnDB;

// Callback class created by WritePreparedTxnDB to check if a key
// is visible by a snapshot.
class WritePreparedSnapshotChecker : public SnapshotChecker {
 public:
  explicit WritePreparedSnapshotChecker(WritePreparedTxnDB* txn_db);
  virtual ~WritePreparedSnapshotChecker() {}

  virtual bool IsInSnapshot(SequenceNumber sequence,
                            SequenceNumber snapshot_sequence) const override;

 private:
#ifndef ROCKSDB_LITE
  const WritePreparedTxnDB* const txn_db_;
#endif  // !ROCKSDB_LITE
};

}  // namespace rocksdb
back to top