file_system.cc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright (c) 2019-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. #include "env/composite_env_wrapper.h"
  7. #include "rocksdb/file_system.h"
  8. #include "options/db_options.h"
  9. #include "rocksdb/utilities/object_registry.h"
  10. namespace ROCKSDB_NAMESPACE {
  11. FileSystem::FileSystem() {}
  12. FileSystem::~FileSystem() {}
  13. Status FileSystem::Load(const std::string& value,
  14. std::shared_ptr<FileSystem>* result) {
  15. Status s;
  16. #ifndef ROCKSDB_LITE
  17. s = ObjectRegistry::NewInstance()->NewSharedObject<FileSystem>(value, result);
  18. #else
  19. (void)result;
  20. s = Status::NotSupported("Cannot load FileSystem in LITE mode: ", value);
  21. #endif
  22. return s;
  23. }
  24. FileOptions FileSystem::OptimizeForLogRead(
  25. const FileOptions& file_options) const {
  26. FileOptions optimized_file_options(file_options);
  27. optimized_file_options.use_direct_reads = false;
  28. return optimized_file_options;
  29. }
  30. FileOptions FileSystem::OptimizeForManifestRead(
  31. const FileOptions& file_options) const {
  32. FileOptions optimized_file_options(file_options);
  33. optimized_file_options.use_direct_reads = false;
  34. return optimized_file_options;
  35. }
  36. FileOptions FileSystem::OptimizeForLogWrite(const FileOptions& file_options,
  37. const DBOptions& db_options) const {
  38. FileOptions optimized_file_options(file_options);
  39. optimized_file_options.bytes_per_sync = db_options.wal_bytes_per_sync;
  40. optimized_file_options.writable_file_max_buffer_size =
  41. db_options.writable_file_max_buffer_size;
  42. return optimized_file_options;
  43. }
  44. FileOptions FileSystem::OptimizeForManifestWrite(
  45. const FileOptions& file_options) const {
  46. return file_options;
  47. }
  48. FileOptions FileSystem::OptimizeForCompactionTableWrite(
  49. const FileOptions& file_options,
  50. const ImmutableDBOptions& db_options) const {
  51. FileOptions optimized_file_options(file_options);
  52. optimized_file_options.use_direct_writes =
  53. db_options.use_direct_io_for_flush_and_compaction;
  54. return optimized_file_options;
  55. }
  56. FileOptions FileSystem::OptimizeForCompactionTableRead(
  57. const FileOptions& file_options,
  58. const ImmutableDBOptions& db_options) const {
  59. FileOptions optimized_file_options(file_options);
  60. optimized_file_options.use_direct_reads = db_options.use_direct_reads;
  61. return optimized_file_options;
  62. }
  63. Status ReadFileToString(FileSystem* fs, const std::string& fname,
  64. std::string* data) {
  65. FileOptions soptions;
  66. data->clear();
  67. std::unique_ptr<FSSequentialFile> file;
  68. Status s = fs->NewSequentialFile(fname, soptions, &file, nullptr);
  69. if (!s.ok()) {
  70. return s;
  71. }
  72. static const int kBufferSize = 8192;
  73. char* space = new char[kBufferSize];
  74. while (true) {
  75. Slice fragment;
  76. s = file->Read(kBufferSize, IOOptions(), &fragment, space,
  77. nullptr);
  78. if (!s.ok()) {
  79. break;
  80. }
  81. data->append(fragment.data(), fragment.size());
  82. if (fragment.empty()) {
  83. break;
  84. }
  85. }
  86. delete[] space;
  87. return s;
  88. }
  89. #ifdef OS_WIN
  90. std::shared_ptr<FileSystem> FileSystem::Default() {
  91. static LegacyFileSystemWrapper default_fs(Env::Default());
  92. static std::shared_ptr<LegacyFileSystemWrapper> default_fs_ptr(
  93. &default_fs, [](LegacyFileSystemWrapper*) {});
  94. return default_fs_ptr;
  95. }
  96. #endif
  97. } // namespace ROCKSDB_NAMESPACE