mirror of https://github.com/ceph/go-ceph
122 lines
3.4 KiB
Go
122 lines
3.4 KiB
Go
//go:build ceph_preview
|
|
|
|
package striper
|
|
|
|
// #cgo LDFLAGS: -lrados -lradosstriper
|
|
// #include <errno.h>
|
|
// #include <stdlib.h>
|
|
// #include <radosstriper/libradosstriper.h>
|
|
import "C"
|
|
|
|
import (
|
|
"github.com/ceph/go-ceph/rados"
|
|
)
|
|
|
|
// Striper helps manage the reading, writing, and management of RADOS
|
|
// striped objects.
|
|
type Striper struct {
|
|
striper C.rados_striper_t
|
|
|
|
// Hold a reference back to the ioctx that the striper depends on so
|
|
// that Go doesn't garbage collect it prematurely.
|
|
ioctx *rados.IOContext
|
|
}
|
|
|
|
// Layout contains a group of values used to define the size parameters of
|
|
// striped objects. Note that these parameters only effect new striped objects.
|
|
// Existing striped objects retain the parameters they were created with.
|
|
type Layout struct {
|
|
StripeUnit uint
|
|
StripeCount uint
|
|
ObjectSize uint
|
|
}
|
|
|
|
// New returns a rados Striper object created from a rados IOContext.
|
|
func New(ioctx *rados.IOContext) (*Striper, error) {
|
|
var s C.rados_striper_t
|
|
ret := C.rados_striper_create(cephIoctx(ioctx), &s)
|
|
if err := getError(ret); err != nil {
|
|
return nil, err
|
|
}
|
|
return &Striper{s, ioctx}, nil
|
|
}
|
|
|
|
// NewWithLayout returns a rados Striper object created from a rados IOContext
|
|
// and striper layout parameters. These parameters will be used when new
|
|
// objects are created.
|
|
func NewWithLayout(ioctx *rados.IOContext, layout Layout) (*Striper, error) {
|
|
striper, err := New(ioctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := striper.SetObjectLayoutStripeUnit(layout.StripeUnit); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := striper.SetObjectLayoutStripeCount(layout.StripeCount); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := striper.SetObjectLayoutObjectSize(layout.ObjectSize); err != nil {
|
|
return nil, err
|
|
}
|
|
return striper, nil
|
|
}
|
|
|
|
// Destroy the radosstriper object at the Ceph API level.
|
|
func (s *Striper) Destroy() {
|
|
C.rados_striper_destroy(s.striper)
|
|
}
|
|
|
|
// SetObjectLayoutStripeUnit sets the stripe unit value used to layout
|
|
// new objects.
|
|
//
|
|
// Implements:
|
|
//
|
|
// int rados_striper_set_object_layout_stripe_unit(rados_striper_t striper,
|
|
// unsigned int stripe_unit);
|
|
func (s *Striper) SetObjectLayoutStripeUnit(count uint) error {
|
|
ret := C.rados_striper_set_object_layout_stripe_unit(
|
|
s.striper,
|
|
C.uint(count),
|
|
)
|
|
return getError(ret)
|
|
}
|
|
|
|
// SetObjectLayoutStripeCount sets the stripe count value used to layout
|
|
// new objects.
|
|
//
|
|
// Implements:
|
|
//
|
|
// int rados_striper_set_object_layout_stripe_count(rados_striper_t striper,
|
|
// unsigned int stripe_count);
|
|
func (s *Striper) SetObjectLayoutStripeCount(count uint) error {
|
|
ret := C.rados_striper_set_object_layout_stripe_count(
|
|
s.striper,
|
|
C.uint(count),
|
|
)
|
|
return getError(ret)
|
|
}
|
|
|
|
// SetObjectLayoutObjectSize sets the object size value used to layout
|
|
// new objects.
|
|
//
|
|
// Implements:
|
|
//
|
|
// int rados_striper_set_object_layout_object_size(rados_striper_t striper,
|
|
// unsigned int object_size);
|
|
func (s *Striper) SetObjectLayoutObjectSize(count uint) error {
|
|
ret := C.rados_striper_set_object_layout_object_size(
|
|
s.striper,
|
|
C.uint(count),
|
|
)
|
|
return getError(ret)
|
|
}
|
|
|
|
// cephIoctx returns a ceph rados_ioctx_t given a go-ceph rados IOContext.
|
|
func cephIoctx(radosIoctx *rados.IOContext) C.rados_ioctx_t {
|
|
p := radosIoctx.Pointer()
|
|
if p == nil {
|
|
panic("invalid IOContext pointer")
|
|
}
|
|
return C.rados_ioctx_t(p)
|
|
}
|