#include "BlueFS.h"
#include "include/stringify.h"
#include "kv/RocksDBStore.h"
+#include "string.h"
rocksdb::Status err_to_status(int r)
{
case -EINVAL:
return rocksdb::Status::InvalidArgument(rocksdb::Status::kNone);
case -EIO:
+ case -EEXIST:
return rocksdb::Status::IOError(rocksdb::Status::kNone);
+ case -ENOLCK:
+ return rocksdb::Status::IOError(strerror(r));
default:
// FIXME :(
- assert(0 == "unrecognized error code");
+ ceph_abort_msg("unrecognized error code");
return rocksdb::Status::NotSupported(rocksdb::Status::kNone);
}
}
// REQUIRES: External synchronization
rocksdb::Status Read(size_t n, rocksdb::Slice* result, char* scratch) override {
int r = fs->read(h, &h->buf, h->buf.pos, n, NULL, scratch);
- assert(r >= 0);
+ ceph_assert(r >= 0);
*result = rocksdb::Slice(scratch, r);
return rocksdb::Status::OK();
}
rocksdb::Status Read(uint64_t offset, size_t n, rocksdb::Slice* result,
char* scratch) const override {
int r = fs->read_random(h, offset, n, scratch);
- assert(r >= 0);
+ ceph_assert(r >= 0);
*result = rocksdb::Slice(scratch, r);
return rocksdb::Status::OK();
}
return false;
}
+ void SetWriteLifeTimeHint(rocksdb::Env::WriteLifeTimeHint hint) override {
+ h->write_hint = (const int)hint;
+ }
+
/*
* Get the size of valid data in the file.
*/
std::unique_ptr<rocksdb::Directory>* result)
{
if (!fs->dir_exists(name))
- return rocksdb::Status::IOError(name, strerror(ENOENT));
+ return rocksdb::Status::NotFound(name, strerror(ENOENT));
result->reset(new BlueRocksDirectory(fs));
return rocksdb::Status::OK();
}
result->clear();
int r = fs->readdir(dir, result);
if (r < 0)
- return rocksdb::Status::IOError(dir, strerror(ENOENT));// return err_to_status(r);
+ return rocksdb::Status::NotFound(dir, strerror(ENOENT));// return err_to_status(r);
return rocksdb::Status::OK();
}
ceph_abort();
}
+rocksdb::Status BlueRocksEnv::AreFilesSame(
+ const std::string& first,
+ const std::string& second, bool* res)
+{
+ for (auto& path : {first, second}) {
+ if (fs->dir_exists(path)) {
+ continue;
+ }
+ std::string dir, file;
+ split(path, &dir, &file);
+ int r = fs->stat(dir, file, nullptr, nullptr);
+ if (!r) {
+ continue;
+ } else if (r == -ENOENT) {
+ return rocksdb::Status::NotFound("AreFilesSame", path);
+ } else {
+ return err_to_status(r);
+ }
+ }
+ *res = (first == second);
+ return rocksdb::Status::OK();
+}
+
rocksdb::Status BlueRocksEnv::LockFile(
const std::string& fname,
rocksdb::FileLock** lock)
if (r < 0)
return err_to_status(r);
delete lock;
+ lock = nullptr;
return rocksdb::Status::OK();
}