env说白就是承接上层系统对文件的读写与下层操作系统交互的功能的一个组件。
先看看rocksdb的env
std::unique_ptr<WritableFile> trace_file;
Status s2 = rocksdb::Env::Default()->NewWritableFile("/tmp/apc",
&trace_file, env_options);
trace_file->Append("i love you ");
trace_file->Flush();
如果代码运行完毕后,系统就会在在/tmp下生成一个名叫abc的文件,里面有个字符串 i love you。
我们具体看看逻辑。
rocksdb::Env::Default() 实现在env_posix.cc里面,最终返回的是一个静态的PosixEnv对象。
PosixEnv本身继承了CompositeEnvWrapper。
另外FileSystem::Default()返回的是PosixFileSystem。
PosixEnv的构造函数里就用PosixFileSystem 初始化了file_system_。
回到上面的代码,
Status NewWritableFile(const std::string& f, std::unique_ptr<WritableFile>* r,
const EnvOptions& options) override {
IODebugContext dbg;
std::unique_ptr<FSWritableFile> file;
Status status;
status =
file_system_->NewWritableFile(f, FileOptions(options), &file, &dbg);
if (status.ok()) {
r->reset(new CompositeWritableFileWrapper(file));
}
return status;
}
在file_system_->NewWritableFile,最终的file是一个PosixWritableFile