Skip to content

Commit f0b9d6d

Browse files
committed
Migrate image manip fns to image.cc
1 parent 8c117bc commit f0b9d6d

File tree

6 files changed

+63
-303
lines changed

6 files changed

+63
-303
lines changed

meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ add_project_arguments('-Wno-unused-parameter', language: 'cpp')
1717

1818
if get_option('buildtype') == 'debug'
1919
add_project_arguments('-fno-inline', language: 'cpp')
20-
add_project_arguments('-DLOGLV=1', language: 'cpp')
20+
add_project_arguments('-DLOGLV=0', language: 'cpp')
2121
endif
2222

2323
subdir('src')

src/image.cc

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,3 +563,60 @@ request *lsvd_image::flush(std::function<void(int)> cb)
563563
{
564564
return new flush_request(this, cb);
565565
}
566+
567+
int lsvd_image::create_new(std::string name, usize size, rados_ioctx_t io)
568+
{
569+
auto be = make_rados_backend(io);
570+
auto parser = object_reader(be);
571+
572+
uuid_t uuid;
573+
uuid_generate_random(uuid);
574+
575+
vec<byte> buf(4096);
576+
vec<seqnum_t> ckpts;
577+
vec<clone_base> clones;
578+
serialise_superblock(buf, ckpts, clones, uuid, size);
579+
580+
return be->write(name, buf.data(), buf.size());
581+
}
582+
583+
int lsvd_image::get_uuid(str name, uuid_t &uuid, rados_ioctx_t io)
584+
{
585+
auto be = make_rados_backend(io);
586+
auto parser = object_reader(be);
587+
auto osb = parser.read_superblock(name);
588+
PR_RET_IF(!osb, -EEXIST, "Could not read superblock '{}'", name);
589+
590+
uuid_copy(uuid, osb->uuid);
591+
return 0;
592+
}
593+
594+
int lsvd_image::delete_image(std::string name, rados_ioctx_t io)
595+
{
596+
auto be = make_rados_backend(io);
597+
auto parser = object_reader(be);
598+
auto osb = parser.read_superblock(name);
599+
PR_RET_IF(!osb, -EEXIST, "Could not read superblock '{}'", name);
600+
auto sb = *osb;
601+
602+
seqnum_t seq;
603+
for (auto ckpt : sb.ckpts) {
604+
auto rc = be->delete_obj(oname(name, ckpt));
605+
PR_RET_IF(rc < 0, rc, "Failed to delete checkpoint '{}'", ckpt);
606+
seq = ckpt;
607+
}
608+
609+
for (int n = 0; n < 16; seq++, n++)
610+
if (be->delete_obj(oname(name, seq)) >= 0)
611+
n = 0;
612+
613+
// delete the superblock last so we can recover from partial deletion
614+
return be->delete_obj(name);
615+
}
616+
617+
int lsvd_image::clone_image(std::string oldname, std::string newname,
618+
rados_ioctx_t io)
619+
{
620+
UNIMPLEMENTED();
621+
return -1;
622+
}

src/image.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ class lsvd_image
101101

102102
// Image management
103103
// They all return 0 on success, -errno on failure
104-
static int create_new(std::string name, rados_ioctx_t io);
105-
static int get_uuid(std::string name, rados_ioctx_t io);
104+
static int create_new(std::string name, usize size, rados_ioctx_t io);
105+
static int get_uuid(std::string name, uuid_t &uuid, rados_ioctx_t io);
106106
static int delete_image(std::string name, rados_ioctx_t io);
107107
static int clone_image(std::string oldname, std::string newname,
108108
rados_ioctx_t io);

src/liblsvd.cc

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -226,27 +226,13 @@ std::pair<std::string, std::string> split_string(std::string s,
226226
extern "C" int rbd_create(rados_ioctx_t io, const char *name, uint64_t size,
227227
int *order)
228228
{
229-
lsvd_config cfg;
230-
if (cfg.read() < 0)
231-
return -1;
232-
auto objstore = make_rados_backend(io);
233-
auto rv = translate_create_image(objstore, name, size);
234-
return rv;
229+
return lsvd_image::create_new(name, size, io);
235230
}
236231

237232
extern "C" int rbd_clone(rados_ioctx_t io, const char *source_img,
238233
const char *dest_img)
239234
{
240-
lsvd_config cfg;
241-
if (cfg.read() < 0) {
242-
throw std::runtime_error("Failed to read config");
243-
return -1;
244-
}
245-
246-
auto objstore = make_rados_backend(io);
247-
auto rv = translate_clone_image(objstore, source_img, dest_img);
248-
249-
return rv;
235+
return lsvd_image::clone_image(source_img, dest_img, io);
250236
}
251237

252238
/* remove all objects and cache file.
@@ -256,20 +242,7 @@ extern "C" int rbd_clone(rados_ioctx_t io, const char *source_img,
256242
*/
257243
extern "C" int rbd_remove(rados_ioctx_t io, const char *name)
258244
{
259-
lsvd_config cfg;
260-
auto rv = cfg.read();
261-
if (rv < 0)
262-
return rv;
263-
auto objstore = make_rados_backend(io);
264-
uuid_t uu;
265-
if ((rv = translate_get_uuid(objstore, name, uu)) < 0)
266-
return rv;
267-
auto rcache_file = cfg.cache_filename(uu, name, LSVD_CFG_READ);
268-
unlink(rcache_file.c_str());
269-
auto wcache_file = cfg.cache_filename(uu, name, LSVD_CFG_WRITE);
270-
unlink(wcache_file.c_str());
271-
rv = translate_remove_image(objstore, name);
272-
return rv;
245+
return lsvd_image::delete_image(name, io);
273246
}
274247

275248
extern "C" void rbd_uuid(rbd_image_t image, uuid_t *uuid)

0 commit comments

Comments
 (0)