};
struct TestPropertiesCollector : public rocksdb::TablePropertiesCollector {
- virtual rocksdb::Status AddUserKey(const rocksdb::Slice& /*key*/,
- const rocksdb::Slice& /*value*/,
- rocksdb::EntryType /*type*/,
- rocksdb::SequenceNumber /*seq*/,
- uint64_t /*file_size*/) override {
+ rocksdb::Status AddUserKey(const rocksdb::Slice& /*key*/,
+ const rocksdb::Slice& /*value*/,
+ rocksdb::EntryType /*type*/,
+ rocksdb::SequenceNumber /*seq*/,
+ uint64_t /*file_size*/) override {
return Status::OK();
}
- virtual rocksdb::Status Finish(
+ rocksdb::Status Finish(
rocksdb::UserCollectedProperties* properties) override {
properties->insert({"0", "1"});
return Status::OK();
}
- virtual const char* Name() const override {
- return "TestTablePropertiesCollector";
- }
+ const char* Name() const override { return "TestTablePropertiesCollector"; }
rocksdb::UserCollectedProperties GetReadableProperties() const override {
rocksdb::UserCollectedProperties ret;
class TestPropertiesCollectorFactory : public TablePropertiesCollectorFactory {
public:
- virtual TablePropertiesCollector* CreateTablePropertiesCollector(
+ TablePropertiesCollector* CreateTablePropertiesCollector(
TablePropertiesCollectorFactory::Context /*context*/) override {
return new TestPropertiesCollector;
}
Status NewWritableFile(const std::string& fname,
std::unique_ptr<WritableFile>* result,
- const EnvOptions& options) {
+ const EnvOptions& options) override {
if (fname.size() > 4 && fname.substr(fname.size() - 4) == ".sst") {
if (!status_.ok()) {
return status_;
ASSERT_LE(1, NumTableFilesAtLevel(0));
}
+class TestFileOperationListener : public EventListener {
+ public:
+ TestFileOperationListener() {
+ file_reads_.store(0);
+ file_reads_success_.store(0);
+ file_writes_.store(0);
+ file_writes_success_.store(0);
+ }
+
+ void OnFileReadFinish(const FileOperationInfo& info) override {
+ ++file_reads_;
+ if (info.status.ok()) {
+ ++file_reads_success_;
+ }
+ ReportDuration(info);
+ }
+
+ void OnFileWriteFinish(const FileOperationInfo& info) override {
+ ++file_writes_;
+ if (info.status.ok()) {
+ ++file_writes_success_;
+ }
+ ReportDuration(info);
+ }
+
+ bool ShouldBeNotifiedOnFileIO() override { return true; }
+
+ std::atomic<size_t> file_reads_;
+ std::atomic<size_t> file_reads_success_;
+ std::atomic<size_t> file_writes_;
+ std::atomic<size_t> file_writes_success_;
+
+ private:
+ void ReportDuration(const FileOperationInfo& info) const {
+ auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(
+ info.finish_timestamp - info.start_timestamp);
+ ASSERT_GT(duration.count(), 0);
+ }
+};
+
+TEST_F(EventListenerTest, OnFileOperationTest) {
+ Options options;
+ options.env = CurrentOptions().env;
+ options.create_if_missing = true;
+
+ TestFileOperationListener* listener = new TestFileOperationListener();
+ options.listeners.emplace_back(listener);
+
+ DestroyAndReopen(options);
+ ASSERT_OK(Put("foo", "aaa"));
+ dbfull()->Flush(FlushOptions());
+ dbfull()->TEST_WaitForFlushMemTable();
+ ASSERT_GE(listener->file_writes_.load(),
+ listener->file_writes_success_.load());
+ ASSERT_GT(listener->file_writes_.load(), 0);
+ Close();
+
+ Reopen(options);
+ ASSERT_GE(listener->file_reads_.load(), listener->file_reads_success_.load());
+ ASSERT_GT(listener->file_reads_.load(), 0);
+}
+
} // namespace rocksdb
#endif // ROCKSDB_LITE