Ceph-Rados-Striper
view release on metacpan or search on metacpan
uint64_t psize
bool debug
PREINIT:
char * buf;
size_t len;
int err;
uint64_t off;
INIT:
PerlIO * io = IoIFP(sv_2io(fh));
uint64_t retlen = 0;
int chk_sz = 1024 * 1024;
Newx(buf, chk_sz, char);
CODE:
printf("debug is %i\n", debug);
if (debug)
printf("preparing to write from FH to %s\n", soid);
for (off=0; off<psize; off+=chk_sz) {
len = psize < off + chk_sz ? psize % chk_sz : chk_sz;
err = PerlIO_read(io, buf, len);
if (err < 0)
croak("cannot read from filehandle: %s", strerror(-err));
if (debug)
printf("writing %" PRIu64 "-%" PRIu64 " / %" PRIu64 " bytes from FH to %s\n", off, off+len, psize, soid);
err = rados_striper_write(striper, soid, buf, len, off);
if (err < 0)
croak("cannot write striped object '%s': %s", soid, strerror(-err));
retlen += len;
}
if (debug)
printf("wrote %" PRIu64 " bytes from FH to %s\n", retlen, soid);
RETVAL = retlen;
OUTPUT:
RETVAL
int
_append(striper, soid, data, len)
rados_striper_t striper
const char * soid
SV * data
size_t len
PREINIT:
const char * buf;
int err;
CODE:
buf = (const char *)SvPV(data, len);
err = rados_striper_append(striper, soid, buf, len);
if (err < 0)
croak("cannot append to striped object '%s': %s", soid, strerror(-err));
RETVAL = err == 0;
OUTPUT:
RETVAL
void
_stat(striper, soid)
rados_striper_t striper
const char * soid
PREINIT:
size_t psize;
time_t pmtime;
int err;
PPCODE:
err = rados_striper_stat(striper, soid, &psize, &pmtime);
if (err < 0)
croak("cannot stat object '%s': %s", soid, strerror(-err));
XPUSHs(sv_2mortal(newSVuv(psize)));
XPUSHs(sv_2mortal(newSVuv(pmtime)));
SV *
_read(striper, soid, len, off = 0)
rados_striper_t striper
const char * soid
size_t len
uint64_t off
PREINIT:
char * buf;
uint64_t retlen;
INIT:
Newx(buf, len, char);
CODE:
retlen = rados_striper_read(striper, soid, buf, len, off);
if (retlen < 0)
croak("cannot read object '%s': %s", soid, strerror(-retlen));
RETVAL = newSVpv(buf, retlen);
OUTPUT:
RETVAL
int
_read_to_fh(striper, soid, fh, len = 0, off = 0, debug=false)
rados_striper_t striper
const char * soid
SV * fh
size_t len
uint64_t off
bool debug
PREINIT:
char * buf;
int buflen;
uint64_t bufpos;
uint64_t psize;
time_t pmtime;
int err;
INIT:
PerlIO * io = IoOFP(sv_2io(fh));
int chk_sz = 1024 * 1024;
Newx(buf, chk_sz, char);
CODE:
if (0 == len) {
// stat and determine read length
err = rados_striper_stat(striper, soid, &psize, &pmtime);
if (err < 0)
croak("cannot stat object '%s': %s", soid, strerror(-err));
len = psize-off;
}
if (debug)
printf("preparing to write from %s to FH, %" PRIu64 " bytes\n", soid, psize);
for (bufpos=off; bufpos<len+off; bufpos+=chk_sz) {
// logic is 'will bufpos move past ien+off next cycle'
buflen = len+off < bufpos+chk_sz ? len % chk_sz : chk_sz;
if (debug)
printf("Reading %u bytes, offset %" PRIu64 ", of %" PRIu64 "-%" PRIu64 "/%" PRIu64 " from striper\n", buflen, bufpos, off, len+off, psize);
err = rados_striper_read(striper, soid, buf, buflen, bufpos);
( run in 0.640 second using v1.01-cache-2.11-cpan-71847e10f99 )