file_reader_writer.h 3.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
//  Copyright (c) 2013, 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.
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include "rocksdb/env.h"

namespace rocksdb {
13 14

class Statistics;
15
class HistogramImpl;
16

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
class SequentialFileReader {
 private:
  std::unique_ptr<SequentialFile> file_;

 public:
  explicit SequentialFileReader(std::unique_ptr<SequentialFile>&& _file)
      : file_(std::move(_file)) {}
  Status Read(size_t n, Slice* result, char* scratch);

  Status Skip(uint64_t n);

  SequentialFile* file() { return file_.get(); }
};

class RandomAccessFileReader : public RandomAccessFile {
 private:
  std::unique_ptr<RandomAccessFile> file_;
34 35 36
  Env* env_;
  Statistics* stats_;
  uint32_t hist_type_;
37
  HistogramImpl* file_read_hist_;
38 39

 public:
40 41 42
  explicit RandomAccessFileReader(std::unique_ptr<RandomAccessFile>&& raf,
                                  Env* env = nullptr,
                                  Statistics* stats = nullptr,
43 44
                                  uint32_t hist_type = 0,
                                  HistogramImpl* file_read_hist = nullptr)
45 46 47
      : file_(std::move(raf)),
        env_(env),
        stats_(stats),
48 49
        hist_type_(hist_type),
        file_read_hist_(file_read_hist) {}
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

  Status Read(uint64_t offset, size_t n, Slice* result, char* scratch) const;

  RandomAccessFile* file() { return file_.get(); }
};

// Use posix write to write data to a file.
class WritableFileWriter {
 private:
  std::unique_ptr<WritableFile> writable_file_;
  size_t cursize_;          // current size of cached data in buf_
  size_t capacity_;         // max size of buf_
  unique_ptr<char[]> buf_;  // a buffer to cache writes
  uint64_t filesize_;
  bool pending_sync_;
  bool pending_fsync_;
  uint64_t last_sync_size_;
  uint64_t bytes_per_sync_;
  RateLimiter* rate_limiter_;

 public:
  explicit WritableFileWriter(std::unique_ptr<WritableFile>&& file,
                              const EnvOptions& options)
      : writable_file_(std::move(file)),
        cursize_(0),
        capacity_(65536),
        buf_(new char[capacity_]),
        filesize_(0),
        pending_sync_(false),
        pending_fsync_(false),
        last_sync_size_(0),
        bytes_per_sync_(options.bytes_per_sync),
        rate_limiter_(options.rate_limiter) {}

  ~WritableFileWriter() { Flush(); }
  Status Append(const Slice& data);

  Status Flush();

  Status Close();

  Status Sync(bool use_fsync);

93 94 95 96 97
  // Sync only the data that was already Flush()ed. Safe to call concurrently
  // with Append() and Flush(). If !writable_file_->IsSyncThreadSafe(),
  // returns NotSupported status.
  Status SyncWithoutFlush(bool use_fsync);

98 99 100 101 102 103 104 105 106 107 108
  uint64_t GetFileSize() { return filesize_; }

  Status InvalidateCache(size_t offset, size_t length) {
    return writable_file_->InvalidateCache(offset, length);
  }

  WritableFile* writable_file() const { return writable_file_.get(); }

 private:
  Status RangeSync(off_t offset, off_t nbytes);
  size_t RequestToken(size_t bytes);
109
  Status SyncInternal(bool use_fsync);
110 111
};
}  // namespace rocksdb