leveldb
Public Member Functions | Public Attributes | List of all members
leveldb::SpecialEnv Class Reference
Inheritance diagram for leveldb::SpecialEnv:
Inheritance graph
[legend]
Collaboration diagram for leveldb::SpecialEnv:
Collaboration graph
[legend]

Public Member Functions

 SpecialEnv (Env *base)
 
Status NewWritableFile (const std::string &f, WritableFile **r)
 
Status NewRandomAccessFile (const std::string &f, RandomAccessFile **r)
 
- Public Member Functions inherited from leveldb::EnvWrapper
 EnvWrapper (Env *t)
 
virtual ~EnvWrapper ()
 
Envtarget () const
 
Status NewSequentialFile (const std::string &f, SequentialFile **r)
 
Status NewRandomAccessFile (const std::string &f, RandomAccessFile **r)
 
Status NewWritableFile (const std::string &f, WritableFile **r)
 
Status NewAppendableFile (const std::string &f, WritableFile **r)
 
bool FileExists (const std::string &f)
 
Status GetChildren (const std::string &dir, std::vector< std::string > *r)
 
Status DeleteFile (const std::string &f)
 
Status CreateDir (const std::string &d)
 
Status DeleteDir (const std::string &d)
 
Status GetFileSize (const std::string &f, uint64_t *s)
 
Status RenameFile (const std::string &s, const std::string &t)
 
Status LockFile (const std::string &f, FileLock **l)
 
Status UnlockFile (FileLock *l)
 
void Schedule (void(*f)(void *), void *a)
 
void StartThread (void(*f)(void *), void *a)
 
virtual Status GetTestDirectory (std::string *path)
 
virtual Status NewLogger (const std::string &fname, Logger **result)
 
uint64_t NowMicros ()
 
void SleepForMicroseconds (int micros)
 
- Public Member Functions inherited from leveldb::Env
 Env ()
 
virtual ~Env ()
 
virtual void Schedule (void(*function)(void *arg), void *arg)=0
 
virtual void StartThread (void(*function)(void *arg), void *arg)=0
 

Public Attributes

port::AtomicPointer delay_data_sync_
 
port::AtomicPointer data_sync_error_
 
port::AtomicPointer no_space_
 
port::AtomicPointer non_writable_
 
port::AtomicPointer manifest_sync_error_
 
port::AtomicPointer manifest_write_error_
 
bool count_random_reads_
 
AtomicCounter random_read_counter_
 

Additional Inherited Members

- Static Public Member Functions inherited from leveldb::Env
static EnvDefault ()
 

Detailed Description

Definition at line 58 of file db_test.cc.

Constructor & Destructor Documentation

§ SpecialEnv()

leveldb::SpecialEnv::SpecialEnv ( Env base)
inlineexplicit

Definition at line 81 of file db_test.cc.

81  : EnvWrapper(base) {
82  delay_data_sync_.Release_Store(NULL);
83  data_sync_error_.Release_Store(NULL);
84  no_space_.Release_Store(NULL);
85  non_writable_.Release_Store(NULL);
86  count_random_reads_ = false;
87  manifest_sync_error_.Release_Store(NULL);
88  manifest_write_error_.Release_Store(NULL);
89  }
bool count_random_reads_
Definition: db_test.cc:78
port::AtomicPointer delay_data_sync_
Definition: db_test.cc:61
port::AtomicPointer manifest_write_error_
Definition: db_test.cc:76
port::AtomicPointer non_writable_
Definition: db_test.cc:70
port::AtomicPointer no_space_
Definition: db_test.cc:67
EnvWrapper(Env *t)
Definition: env.h:291
port::AtomicPointer data_sync_error_
Definition: db_test.cc:64
port::AtomicPointer manifest_sync_error_
Definition: db_test.cc:73

Member Function Documentation

§ NewRandomAccessFile()

Status leveldb::SpecialEnv::NewRandomAccessFile ( const std::string &  f,
RandomAccessFile **  r 
)
inlinevirtual

Implements leveldb::Env.

Definition at line 164 of file db_test.cc.

164  {
165  class CountingFile : public RandomAccessFile {
166  private:
167  RandomAccessFile* target_;
168  AtomicCounter* counter_;
169  public:
170  CountingFile(RandomAccessFile* target, AtomicCounter* counter)
171  : target_(target), counter_(counter) {
172  }
173  virtual ~CountingFile() { delete target_; }
174  virtual Status Read(uint64_t offset, size_t n, Slice* result,
175  char* scratch) const {
176  counter_->Increment();
177  return target_->Read(offset, n, result, scratch);
178  }
179  };
180 
181  Status s = target()->NewRandomAccessFile(f, r);
182  if (s.ok() && count_random_reads_) {
183  *r = new CountingFile(*r, &random_read_counter_);
184  }
185  return s;
186  }
bool count_random_reads_
Definition: db_test.cc:78
virtual Status NewRandomAccessFile(const std::string &fname, RandomAccessFile **result)=0
AtomicCounter random_read_counter_
Definition: db_test.cc:79
Env * target_
Definition: env.h:346
Env * target() const
Definition: env.h:295
Here is the call graph for this function:

§ NewWritableFile()

Status leveldb::SpecialEnv::NewWritableFile ( const std::string &  f,
WritableFile **  r 
)
inlinevirtual

Implements leveldb::Env.

Definition at line 91 of file db_test.cc.

91  {
92  class DataFile : public WritableFile {
93  private:
94  SpecialEnv* env_;
95  WritableFile* base_;
96 
97  public:
98  DataFile(SpecialEnv* env, WritableFile* base)
99  : env_(env),
100  base_(base) {
101  }
102  ~DataFile() { delete base_; }
103  Status Append(const Slice& data) {
104  if (env_->no_space_.Acquire_Load() != NULL) {
105  // Drop writes on the floor
106  return Status::OK();
107  } else {
108  return base_->Append(data);
109  }
110  }
111  Status Close() { return base_->Close(); }
112  Status Flush() { return base_->Flush(); }
113  Status Sync() {
114  if (env_->data_sync_error_.Acquire_Load() != NULL) {
115  return Status::IOError("simulated data sync error");
116  }
117  while (env_->delay_data_sync_.Acquire_Load() != NULL) {
118  DelayMilliseconds(100);
119  }
120  return base_->Sync();
121  }
122  };
123  class ManifestFile : public WritableFile {
124  private:
125  SpecialEnv* env_;
126  WritableFile* base_;
127  public:
128  ManifestFile(SpecialEnv* env, WritableFile* b) : env_(env), base_(b) { }
129  ~ManifestFile() { delete base_; }
130  Status Append(const Slice& data) {
131  if (env_->manifest_write_error_.Acquire_Load() != NULL) {
132  return Status::IOError("simulated writer error");
133  } else {
134  return base_->Append(data);
135  }
136  }
137  Status Close() { return base_->Close(); }
138  Status Flush() { return base_->Flush(); }
139  Status Sync() {
140  if (env_->manifest_sync_error_.Acquire_Load() != NULL) {
141  return Status::IOError("simulated sync error");
142  } else {
143  return base_->Sync();
144  }
145  }
146  };
147 
148  if (non_writable_.Acquire_Load() != NULL) {
149  return Status::IOError("simulated write error");
150  }
151 
152  Status s = target()->NewWritableFile(f, r);
153  if (s.ok()) {
154  if (strstr(f.c_str(), ".ldb") != NULL ||
155  strstr(f.c_str(), ".log") != NULL) {
156  *r = new DataFile(this, *r);
157  } else if (strstr(f.c_str(), "MANIFEST") != NULL) {
158  *r = new ManifestFile(this, *r);
159  }
160  }
161  return s;
162  }
SpecialEnv(Env *base)
Definition: db_test.cc:81
virtual Status NewWritableFile(const std::string &fname, WritableFile **result)=0
static Status OK()
Definition: status.h:32
port::AtomicPointer non_writable_
Definition: db_test.cc:70
static Status IOError(const Slice &msg, const Slice &msg2=Slice())
Definition: status.h:47
Env * target() const
Definition: env.h:295
Here is the call graph for this function:

Member Data Documentation

§ count_random_reads_

bool leveldb::SpecialEnv::count_random_reads_

Definition at line 78 of file db_test.cc.

§ data_sync_error_

port::AtomicPointer leveldb::SpecialEnv::data_sync_error_

Definition at line 64 of file db_test.cc.

§ delay_data_sync_

port::AtomicPointer leveldb::SpecialEnv::delay_data_sync_

Definition at line 61 of file db_test.cc.

§ manifest_sync_error_

port::AtomicPointer leveldb::SpecialEnv::manifest_sync_error_

Definition at line 73 of file db_test.cc.

§ manifest_write_error_

port::AtomicPointer leveldb::SpecialEnv::manifest_write_error_

Definition at line 76 of file db_test.cc.

§ no_space_

port::AtomicPointer leveldb::SpecialEnv::no_space_

Definition at line 67 of file db_test.cc.

§ non_writable_

port::AtomicPointer leveldb::SpecialEnv::non_writable_

Definition at line 70 of file db_test.cc.

§ random_read_counter_

AtomicCounter leveldb::SpecialEnv::random_read_counter_

Definition at line 79 of file db_test.cc.


The documentation for this class was generated from the following file: