Ceph-Rados-Striper

 view release on metacpan or  search on metacpan

Striper.xs  view on Meta::CPAN

    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 )