Thanks a lot!
If I understand the question correctly, you do not
need to read and write
with
the same underlying stripe/block size as of the image itself. If you wanted
to
write a 16 bytes to an image you can just pass it a 16 byte long slice (to
use
the Go term).
Do you mean that if I pass the 10MiB bytes array to WriteAt func with
default image configs it will strip it into 2 4MiB requests? for example,
if I mount an Image to Linux I can specify the block size and each IO will
be 4K for example and if I'm not wrong each op in Ceph will be 4K too. Now
how can I simulate that behavior here too?
I'm also facing an issue with go-ceph that with a 5-second interval I'm
discarding and writing data to an image. After a while, for example, 30 sec
the write will be stuck and it doesn't throw any error! How can I check
what is wrong with it? cluster health is OK.
On Thu, Dec 24, 2020 at 7:05 PM John Mulligan <phlogistonjohn(a)asynchrono.us>
wrote:
> On Thursday, December 24, 2020 8:25:15 AM EST Seena Fallah wrote:
> > Hi,
> >
> > I want to write and read from an rbd image with librbd (librbdpy or
> > go-ceph). I got some questions:
> >
>
> I'll try to touch on some of the below for go-ceph specifically. However,
> the
> principles should generally apply to librdb (C) or python as all three
> libraries are ultimately backed by the same stuff. Our naming should
> largely
> match what you'd find in librbd but occasionally we need to change things
> a
> little bit to match Go naming conventions and common interfaces [0].
>
>
> > 1. How can I do a random write/read with it?
>
> I would use the WriteAt [1] and ReadAt [2] calls on the Image type.
>
> > 2. How can I delete the written data with it?
>
> I'm not entirely clear on this question. You can delete an entire image.
> Or
> you could also zero out a range of data within the image either using
> something like Discard [3] or WriteSame [4].
>
> > 3. If I want to write with a for example 4K block size should I break my
> > bytes array to 4K arrays by my self or librbd will do it on its own?
>
If I understand the question correctly, you do not
need to read and write
> with
> the same underlying stripe/block size as of the image itself. If you
> wanted to
> write a 16 bytes to an image you can just pass it a 16 byte long slice (to
> use
> the Go term).
>
> You may find certain buffer sizes perform better than others, but the
> library
> doesn't require it, IIUC.
>
>
> > 4. Does rbd_cache included in it? If yes how can I disable it?
> >
>
> Unfortunately, I'm afraid I can't help with this one without more info as
> I'm
> not sure what it refers to. Perhaps someone with deeper experience
> specifically
> in rbd may know.
>
> I can say that go-ceph can load any ceph conf file, passing it to the
> underlying ceph libraries, so if its something you can disable for the rbd
> command line tool you ought to be able to do so for go-ceph [5].
>
> > Thanks.
>
> [0] - We try to document what ceph API functions are being wrapped but
> we're
> not perfect and not all older code has had these "Implements" sections
> added
> to the inline docs.
> [1] -
https://pkg.go.dev/github.com/ceph/go-ceph@v0.7.0/rbd#Image.WriteAt
> [2] -
https://pkg.go.dev/github.com/ceph/go-ceph@v0.7.0/rbd#Image.ReadAt
> [3] -
https://pkg.go.dev/github.com/ceph/go-ceph@v0.7.0/rbd#Image.Discard
> [4] -
>
https://pkg.go.dev/github.com/ceph/go-ceph@v0.7.0/rbd#Image.WriteSame
> [5] - For rbd use the set up functions in the rados module to get an
> IOContext.
https://pkg.go.dev/github.com/ceph/go-ceph@v0.7.0/
> rados#Conn.ReadDefaultConfigFile - Please file issues with go-ceph if you
> try it
> and something does not work.
>
>
>