Skip to content

Commit

Permalink
Get everything into a runnable state
Browse files Browse the repository at this point in the history
  • Loading branch information
IsaacKhor committed Sep 26, 2024
1 parent 2afeb4b commit 8dbfbd4
Show file tree
Hide file tree
Showing 18 changed files with 449 additions and 384 deletions.
18 changes: 16 additions & 2 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,31 @@ cxx = meson.get_compiler('cpp')

subdir('src')

executable(
lsvd_ar = static_library(
'lsvd',
lsvd_src,
include_directories: lsvd_inc,
dependencies: lsvd_deps,
)

executable(
'lsvd',
lsvd_tgt_src + lsvd_src,
dependencies: lsvd_deps + [dependency('_spdk')],
)

executable(
'imgtool',
['src/imgtool.cc'],
link_with: lsvd_ar,
dependencies: lsvd_deps,
)

# executable(
# 'imgtool',
# lsvd_src + ['tools/imgtool.cc'],
# include_directories: lsvd_inc,
# dependencies: lsvd_deps,
# )

# subdir('test')
subdir('test')
26 changes: 21 additions & 5 deletions src/backend.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <system_error>

#include "backend.h"
#include "folly/logging/xlog.h"
#include "utils.h"

class Rados : public ObjStore
Expand Down Expand Up @@ -96,6 +97,7 @@ class Rados : public ObjStore

auto read(fstr name, off_t offset, smartiov &v) -> ResTask<usize> override
{
XLOGF(DBG3, "Reading object '{}'", name);
auto &&[p, f] = folly::coro::makePromiseContract<int>();
RadosCbWrap cb(std::move(p));
auto bl = iov_to_bl(v);
Expand All @@ -107,6 +109,7 @@ class Rados : public ObjStore

auto read(fstr name, off_t offset, iovec v) -> ResTask<usize> override
{
XLOGF(DBG3, "Reading object '{}'", name);
auto &&[p, f] = folly::coro::makePromiseContract<int>();
RadosCbWrap cb(std::move(p));
auto bl = iov_to_bl(v);
Expand Down Expand Up @@ -141,6 +144,7 @@ class Rados : public ObjStore

auto write(fstr name, smartiov &v) -> ResTask<usize> override
{
XLOGF(DBG3, "Writing object '{}'", name);
auto &&[p, f] = folly::coro::makePromiseContract<int>();
RadosCbWrap cb(std::move(p));
auto bl = iov_to_bl(v);
Expand All @@ -151,6 +155,7 @@ class Rados : public ObjStore

auto write(fstr name, iovec v) -> ResTask<usize> override
{
XLOGF(DBG3, "Writing object '{}'", name);
auto &&[p, f] = folly::coro::makePromiseContract<int>();
RadosCbWrap cb(std::move(p));
auto bl = iov_to_bl(v);
Expand All @@ -161,6 +166,7 @@ class Rados : public ObjStore

auto remove(fstr name) -> ResTask<void> override
{
XLOGF(DBG3, "Removing object '{}'", name);
auto &&[p, f] = folly::coro::makePromiseContract<int>();
RadosCbWrap cb(std::move(p));
auto rc = io.aio_remove(name.toStdString(), cb.cb);
Expand All @@ -174,25 +180,35 @@ class Rados : public ObjStore
}
};

Result<uptr<ObjStore>> ObjStore::connect_to_pool(fstr pool_name)
Result<sptr<ObjStore>> ObjStore::connect_to_pool(fstr pool_name)
{
XLOGF(INFO, "Connecting to pool '{}'", pool_name);

rados_t cluster;
auto rc = rados_create(&cluster, "admin");
if (rc < 0)
if (rc < 0) {
XLOGF(ERR, "Failed to create rados cluster: {}", -rc);
return outcome::failure(std::error_code(-rc, std::system_category()));
}

rc = rados_conf_read_file(cluster, nullptr);
if (rc < 0)
if (rc < 0) {
XLOGF(ERR, "Failed to read conf file: {}", -rc);
return outcome::failure(std::error_code(-rc, std::system_category()));
}

rc = rados_connect(cluster);
if (rc < 0)
if (rc < 0) {
XLOGF(ERR, "Failed to connect to the cluster: {}", -rc);
return outcome::failure(std::error_code(-rc, std::system_category()));
}

rados_ioctx_t io;
rc = rados_ioctx_create(cluster, pool_name.toStdString().c_str(), &io);
if (rc < 0)
if (rc < 0) {
XLOGF(ERR, "Failed to connect to the pool: {}", -rc);
return outcome::failure(std::error_code(-rc, std::system_category()));
}

return uptr<ObjStore>(new Rados(cluster, io));
}
2 changes: 1 addition & 1 deletion src/backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class ObjStore
virtual ResTask<usize> write(fstr name, iovec iov) = 0;
virtual ResTask<void> remove(fstr name) = 0;

static Result<uptr<ObjStore>> connect_to_pool(fstr pool_name);
static Result<sptr<ObjStore>> connect_to_pool(fstr pool_name);
};

class FileIo
Expand Down
12 changes: 6 additions & 6 deletions src/bdev_lsvd.cc
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ static void lsvd_submit_io(spdk_io_channel *c, spdk_bdev_io *io)
lio->r = img->trim(offset, len, comp);
break;
default:
log_error("Unknown request type: {}", io->type);
XLOGF(ERR,"Unknown request type: {}", io->type);
return;
}

Expand All @@ -189,7 +189,7 @@ auto bdev_lsvd_create(str img_name, rados_ioctx_t ioctx,
try {
img = uptr<lsvd_image>(new lsvd_image(img_name, ioctx, cfg));
} catch (std::runtime_error &e) {
log_error("Failed to create image '{}': {}", img_name, e.what());
XLOGF(ERR,"Failed to create image '{}': {}", img_name, e.what());
return outcome::failure(std::errc::io_error);
}

Expand All @@ -211,7 +211,7 @@ auto bdev_lsvd_create(str img_name, rados_ioctx_t ioctx,

auto err = spdk_bdev_register(&iodev->bdev);
if (err) {
log_error("Failed to register bdev: err {}", (err));
XLOGF(ERR,"Failed to register bdev: err {}", (err));
spdk_io_device_unregister(
iodev, [](void *ctx) { delete (lsvd_iodevice *)ctx; });

Expand All @@ -231,21 +231,21 @@ auto bdev_lsvd_create(str pool_name, str image_name,

void bdev_lsvd_delete(str img_name, std::function<void(Result<void>)> cb)
{
log_info("Deleting image '{}'", img_name);
XLOGF(INFO, "Deleting image '{}'", img_name);
auto rc = spdk_bdev_unregister_by_name(
img_name.c_str(), &lsvd_if,
// some of the ugliest lifetime management code you'll ever see, but
// it should work
[](void *arg, int rc) {
log_info("Image deletion done, rc = {}", rc);
XLOGF(INFO, "Image deletion done, rc = {}", rc);
auto cb = (std::function<void(Result<void>)> *)arg;
(*cb)(errcode_to_result<void>(rc));
delete cb;
},
new std::function<void(Result<void>)>(cb));

if (rc != 0) {
log_error("Failed to delete image '{}': {}", img_name, rc);
XLOGF(ERR,"Failed to delete image '{}': {}", img_name, rc);
cb(outcome::failure(std::error_code(rc, std::system_category())));
}
}
2 changes: 1 addition & 1 deletion src/bdev_lsvd_rpc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ static void rpc_bdev_lsvd_delete(struct spdk_jsonrpc_request *req_json,
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(req_json, w);
} else {
log_error("Failed to destroy lsvd bdev: {}", res.error().message());
XLOGF(ERR,"Failed to destroy lsvd bdev: {}", res.error().message());
spdk_jsonrpc_send_error_response(req_json, rc,
"Failed to destroy lsvd bdev");
}
Expand Down
28 changes: 27 additions & 1 deletion src/extmap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <memory>

#include "extmap.h"
#include "folly/String.h"
#include "zpp_bits.h"

Task<vec<std::pair<usize, S3Ext>>> ExtMap::lookup(usize offset, usize len)
Expand Down Expand Up @@ -96,10 +97,13 @@ void ExtMap::unmap_locked(usize offset, usize len)
}

// Remove all extents that are fully contained in the new extent
// BUG: not sure how
while (it != map.end() && it->first < end) {
auto &[base, ext] = *it;
if (base + ext.len < end)
it = map.erase(it);
else
break;
}

// Shrink the extent after the offset to start at the new extent end
Expand Down Expand Up @@ -155,5 +159,27 @@ uptr<ExtMap> ExtMap::deserialise(vec<byte> buf)
auto res = ar(map);
// TODO handle error
assert(zpp::bits::failure(res) == false);
return std::make_unique<ExtMap>(map);
XLOGF(INFO, "Deserialised map with {} entries", map.size());
return std::unique_ptr<ExtMap>(new ExtMap(std::move(map)));
}

uptr<ExtMap> ExtMap::create_empty(usize len)
{
auto m = std::unique_ptr<ExtMap>(new ExtMap());
m->map.insert({0, S3Ext{0, 0, len}});
return m;
}

Task<std::string> ExtMap::to_string()
{
auto l = co_await mtx.co_scoped_lock();
fvec<std::string> entries;
for (auto &[base, ext] : map) {
auto s =
fmt::format("Extent: {:#x} -> {:#x}: (seqnum: {:#x}, "
"offset: {:#x}, len: {:#x})",
base, base + ext.len, ext.seqnum, ext.offset, ext.len);
entries.push_back(s);
}
co_return folly::join("\n", entries);
}
7 changes: 5 additions & 2 deletions src/extmap.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#include <folly/experimental/coro/SharedMutex.h>
#include <iostream>
#include <map>
#include <unistd.h>
#include <utility>
Expand Down Expand Up @@ -40,15 +39,19 @@ class ExtMap
// Internal use, assumes the lock is already held
void unmap_locked(usize base, usize len);

public:
ExtMap() {}
ExtMap(std::map<usize, S3Ext> map) : map(std::move(map)) {}

public:
~ExtMap() {}

Task<vec<std::pair<usize, S3Ext>>> lookup(usize offset, usize len);
Task<void> update(usize base, usize len, S3Ext val);
Task<void> unmap(usize base, usize len);

Task<std::string> to_string();
Task<vec<byte>> serialise();
static uptr<ExtMap> deserialise(vec<byte> buf);

static uptr<ExtMap> create_empty(usize len);
};
Loading

0 comments on commit 8dbfbd4

Please sign in to comment.