1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. 2 // This source code is licensed under both the GPLv2 (found in the 3 // COPYING file in the root directory) and Apache 2.0 License 4 // (found in the LICENSE.Apache file in the root directory). 5 6 #pragma once 7 8 #include "rocksdb/types.h" 9 10 namespace ROCKSDB_NAMESPACE { 11 12 class ReadCallback { 13 public: ReadCallback(SequenceNumber last_visible_seq)14 ReadCallback(SequenceNumber last_visible_seq) 15 : max_visible_seq_(last_visible_seq) {} ReadCallback(SequenceNumber last_visible_seq,SequenceNumber min_uncommitted)16 ReadCallback(SequenceNumber last_visible_seq, SequenceNumber min_uncommitted) 17 : max_visible_seq_(last_visible_seq), min_uncommitted_(min_uncommitted) {} 18 ~ReadCallback()19 virtual ~ReadCallback() {} 20 21 // Will be called to see if the seq number visible; if not it moves on to 22 // the next seq number. 23 virtual bool IsVisibleFullCheck(SequenceNumber seq) = 0; 24 IsVisible(SequenceNumber seq)25 inline bool IsVisible(SequenceNumber seq) { 26 assert(min_uncommitted_ > 0); 27 assert(min_uncommitted_ >= kMinUnCommittedSeq); 28 if (seq < min_uncommitted_) { // handles seq == 0 as well 29 assert(seq <= max_visible_seq_); 30 return true; 31 } else if (max_visible_seq_ < seq) { 32 assert(seq != 0); 33 return false; 34 } else { 35 assert(seq != 0); // already handled in the first if-then clause 36 return IsVisibleFullCheck(seq); 37 } 38 } 39 max_visible_seq()40 inline SequenceNumber max_visible_seq() { return max_visible_seq_; } 41 42 // Refresh to a more recent visible seq Refresh(SequenceNumber seq)43 virtual void Refresh(SequenceNumber seq) { max_visible_seq_ = seq; } 44 45 protected: 46 // The max visible seq, it is usually the snapshot but could be larger if 47 // transaction has its own writes written to db. 48 SequenceNumber max_visible_seq_ = kMaxSequenceNumber; 49 // Any seq less than min_uncommitted_ is committed. 50 const SequenceNumber min_uncommitted_ = kMinUnCommittedSeq; 51 }; 52 53 } // namespace ROCKSDB_NAMESPACE 54