Ceph-Rados

 view release on metacpan or  search on metacpan

XS/IO.xs  view on Meta::CPAN

  CODE:
    buf = (const char *)SvPV(data, len);
    err = rados_append(io, oid, buf, len);
    if (err < 0)
        croak("cannot append to object '%s': %s", oid, strerror(-err));
    RETVAL = err == 0;
  OUTPUT:
    RETVAL

void
_stat(io, oid)
    rados_ioctx_t    io
    const char *     oid
  PREINIT:
    size_t           size;
    time_t           mtime;
    int              err;
  PPCODE:
    err = rados_stat(io, oid, &size, &mtime);
    if (err < 0)
        croak("cannot stat object '%s': %s", oid, strerror(-err));
    XPUSHs(sv_2mortal(newSVuv(size)));
    XPUSHs(sv_2mortal(newSVuv(mtime)));


SV *
_read(io, oid, len, off = 0)
    rados_ioctx_t    io
    const char *     oid

XS/IO.xs  view on Meta::CPAN

    size_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) || debug) {
        // stat and determine read length
        err = rados_stat(ioctx, oid, &psize, &pmtime);
        if (err < 0)
            croak("cannot stat object '%s': %s", oid, strerror(-err));
    }
    if (0 == len)
        len = psize-off;
    if (debug)
        printf("preparing to write from %s to FH, %zu bytes\n", oid, len);
    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;

lib/Ceph/Rados.pm  view on Meta::CPAN

  use Ceph::Rados;

  my $cluster = Ceph::Rados->new('admin');
  $cluster->set_config_file;
  $cluster->set_config_option( keyring => '/etc/ceph/ceph.client.admin.keyring');
  $cluster->connect;

  my $io = $cluster->io('testing_pool');
  $io->write('greeting', 'hello');
  my $stored_data = $io->read('greeting',10);
  my ($len, $mtime) = $io->stat('greeting');
  $io->delete('greeting');

  my $list = $io->list;
  while (my $entry = $list->next) {
      print "Found $entry\n";
  }

=head1 DESCRIPTION

This module provides a very limited subset of the librados API,

lib/Ceph/Rados/IO.pm  view on Meta::CPAN

}

sub read_handle_perl {
    my ($self, $oid, $handle, $len, $off) = @_;
    my $is_filehandle = openhandle($handle);
    my $is_writable_object = blessed($handle) and $handle->can('write');
    Carp::confess "Called with neither an open filehandle equivalent nor an object with a \`write\` method"
        unless $is_filehandle or $is_writable_object;
    $off //= 0;
    if (!$len) {
        ($len, undef) = $self->_stat($oid);
    }
    my $count = 0;
    #
    for (my $pos = $off; $pos <= $len+$off; $pos += $DEFAULT_OSD_MAX_WRITE) {
        my $chunk;
        if ($pos + $DEFAULT_OSD_MAX_WRITE > $len) {
            $chunk = $len % $DEFAULT_OSD_MAX_WRITE;
        } else {
            $chunk = $DEFAULT_OSD_MAX_WRITE;
        }

lib/Ceph/Rados/IO.pm  view on Meta::CPAN

    } else {
        Carp::confess "Called with neither an open filehandle equivalent nor an object with a \`write\` method";
    }
}


sub read {
    my ($self, $oid, $len, $off) = @_;
    # if undefined is passed as len, we stat the obj first to get the correct len
    if (!defined($len)) {
        ($len, undef) = $self->stat($oid);
    }
    $off ||= 0;
    $self->_read($oid, $len, $off);
}

sub stat {
    my ($self, $oid) = @_;
    $self->_stat($oid);
}

sub pool_required_alignment {
    my ($self) = @_;
    return $self->_pool_required_alignment();
}

sub mtime {
    my ($self, $oid) = @_;
    my (undef, $mtime) = $self->stat($oid);
    $mtime;
}

sub size {
    my ($self, $oid) = @_;
    my ($size, undef) = $self->stat($oid);
    $size;
}

# Autoload methods go after =cut, and are processed by the autosplit program.

1;
__END__
# Below is stub documentation for your module. You'd better edit it!

=head1 NAME

lib/Ceph/Rados/IO.pm  view on Meta::CPAN

=head2 write_data(oid, data)

=head2 write_handle(oid, handle)

As L<write_data()>, but explicitly declaring the source type.

=head2 append(oid, data)

Wraps C<rados_append()>.  Appends data to the ceph object with the supplied ID.  Data must be a perl scalar, not a handle.  Returns 1 on success.  Croaks on failure.

=head2 stat(oid)

Wraps C<rados_stat()>.  Returns a 2-element list of (filesize, mtime) for the ceph object with the supplied ID.

=head2 read(oid, len=filesize, offset=0)

Wraps C<rados_read()>.  Read data from the ceph object with the supplied ID, and return the data read.  Croaks on failure.

=head2 read_handle(oid, handle)

As C<read()>, but writes the data directly to the supplied handle instead of returning it.

=head2 remove(oid)

t/100_raw_api_crud.t  view on Meta::CPAN

    ok( $io->write($filename, $content), "Write object" );
    ok( $io->mtime($filename), "Get file mod time" );
    my $length;
    ok( $length = $io->size($filename), "Get file size" );
    is( $length, length($content), "Get correct size" );
    $length = length($content); # just to be sure following tests don't fail if above does
    ok( my $stored_data = $io->read($filename, $length), "Read $length bytes from object" );
    is( $stored_data, $content, "Get back content ok" );
    ok( my $stored_data2 = $io->read($filename), "Read unknown bytes from object" );
    is( $stored_data2, $content, "Get back content ok without read size" );
    ok( my ($stat_size, $stat_mtime) = $io->stat($filename), "Stat object" );
    is( $stat_size, $length, "Stat size is same as content length" );
    ok( $list = $io->list, "Opened list context" );
    my $match = 0;
    while (my $entry = $list->next) {
        #diag "Found $entry";
        $match = 1 if $entry eq $filename;
    }
    ok( $match, "List contains written file" );
    ok( $io->remove($filename), "Remove object" );
    lives_ok { undef $list } "Closed list context";



( run in 0.466 second using v1.01-cache-2.11-cpan-49f99fa48dc )