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 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 7 // Use of this source code is governed by a BSD-style license that can be 8 // found in the LICENSE file. See the AUTHORS file for names of contributors. 9 10 #pragma once 11 #include <atomic> 12 #include <string> 13 #include "port/port.h" 14 #include "rocksdb/env.h" 15 #include "rocksdb/file_system.h" 16 17 namespace ROCKSDB_NAMESPACE { 18 19 // SequentialFileReader is a wrapper on top of Env::SequentialFile. It handles 20 // Buffered (i.e when page cache is enabled) and Direct (with O_DIRECT / page 21 // cache disabled) reads appropriately, and also updates the IO stats. 22 class SequentialFileReader { 23 private: 24 std::unique_ptr<FSSequentialFile> file_; 25 std::string file_name_; 26 std::atomic<size_t> offset_{0}; // read offset 27 28 public: SequentialFileReader(std::unique_ptr<FSSequentialFile> && _file,const std::string & _file_name)29 explicit SequentialFileReader(std::unique_ptr<FSSequentialFile>&& _file, 30 const std::string& _file_name) 31 : file_(std::move(_file)), file_name_(_file_name) {} 32 SequentialFileReader(std::unique_ptr<FSSequentialFile> && _file,const std::string & _file_name,size_t _readahead_size)33 explicit SequentialFileReader(std::unique_ptr<FSSequentialFile>&& _file, 34 const std::string& _file_name, 35 size_t _readahead_size) 36 : file_(NewReadaheadSequentialFile(std::move(_file), _readahead_size)), 37 file_name_(_file_name) {} 38 SequentialFileReader(SequentialFileReader && o)39 SequentialFileReader(SequentialFileReader&& o) ROCKSDB_NOEXCEPT { 40 *this = std::move(o); 41 } 42 43 SequentialFileReader& operator=(SequentialFileReader&& o) ROCKSDB_NOEXCEPT { 44 file_ = std::move(o.file_); 45 return *this; 46 } 47 48 SequentialFileReader(const SequentialFileReader&) = delete; 49 SequentialFileReader& operator=(const SequentialFileReader&) = delete; 50 51 Status Read(size_t n, Slice* result, char* scratch); 52 53 Status Skip(uint64_t n); 54 file()55 FSSequentialFile* file() { return file_.get(); } 56 file_name()57 std::string file_name() { return file_name_; } 58 use_direct_io()59 bool use_direct_io() const { return file_->use_direct_io(); } 60 61 private: 62 // NewReadaheadSequentialFile provides a wrapper over SequentialFile to 63 // always prefetch additional data with every read. 64 static std::unique_ptr<FSSequentialFile> NewReadaheadSequentialFile( 65 std::unique_ptr<FSSequentialFile>&& file, size_t readahead_size); 66 }; 67 } // namespace ROCKSDB_NAMESPACE 68