rebase: bump github.com/ceph/go-ceph from 0.11.0 to 0.12.0

Bumps [github.com/ceph/go-ceph](https://github.com/ceph/go-ceph) from 0.11.0 to 0.12.0.
- [Release notes](https://github.com/ceph/go-ceph/releases)
- [Changelog](https://github.com/ceph/go-ceph/blob/master/docs/release-process.md)
- [Commits](https://github.com/ceph/go-ceph/compare/v0.11.0...v0.12.0)

---
updated-dependencies:
- dependency-name: github.com/ceph/go-ceph
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
dependabot[bot] 2021-10-18 20:26:15 +00:00 committed by mergify[bot]
parent fedbb01ec3
commit a66012a5d4
38 changed files with 560 additions and 192 deletions

2
go.mod
View File

@ -5,7 +5,7 @@ go 1.16
require ( require (
github.com/aws/aws-sdk-go v1.41.0 github.com/aws/aws-sdk-go v1.41.0
github.com/ceph/ceph-csi/api v0.0.0-00010101000000-000000000000 github.com/ceph/ceph-csi/api v0.0.0-00010101000000-000000000000
github.com/ceph/go-ceph v0.11.0 github.com/ceph/go-ceph v0.12.0
github.com/container-storage-interface/spec v1.5.0 github.com/container-storage-interface/spec v1.5.0
github.com/csi-addons/replication-lib-utils v0.2.0 github.com/csi-addons/replication-lib-utils v0.2.0
github.com/csi-addons/spec v0.1.1 github.com/csi-addons/spec v0.1.1

4
go.sum
View File

@ -161,8 +161,8 @@ github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3
github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f/go.mod h1:C0rtzmGXgN78pYR0tGJFhtHgkbAs0lIbHwkB81VxDQE= github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f/go.mod h1:C0rtzmGXgN78pYR0tGJFhtHgkbAs0lIbHwkB81VxDQE=
github.com/ceph/go-ceph v0.11.0 h1:A1pphV40LL8GQKDPpU4XqCa7gkmozsst7rhCC730/nk= github.com/ceph/go-ceph v0.12.0 h1:nlFgKQZXOFR4oMnzXsKwTr79Y6EYDwqTrpigICGy/Tw=
github.com/ceph/go-ceph v0.11.0/go.mod h1:mafFpf5Vg8Ai8Bd+FAMvKBHLmtdpTXdRP/TNq8XWegY= github.com/ceph/go-ceph v0.12.0/go.mod h1:mafFpf5Vg8Ai8Bd+FAMvKBHLmtdpTXdRP/TNq8XWegY=
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=

View File

@ -1,3 +1,4 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
package admin package admin

View File

@ -1,3 +1,4 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
package admin package admin

View File

@ -1,3 +1,4 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
package admin package admin

View File

@ -1,3 +1,4 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
package admin package admin

View File

@ -1,3 +1,4 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
package admin package admin

View File

@ -1,3 +1,4 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
package admin package admin

View File

@ -1,3 +1,4 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
package admin package admin

View File

@ -1,3 +1,4 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
package admin package admin

View File

@ -1,3 +1,4 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
package admin package admin

View File

@ -60,10 +60,10 @@ func (v *PtrGuard) Release() {
// The uintptrPtr() helper function below assumes that uintptr has the same size // The uintptrPtr() helper function below assumes that uintptr has the same size
// as a pointer, although in theory it could be larger. Therefore we use this // as a pointer, although in theory it could be larger. Therefore we use this
// constant expression to assert size equality as a safeguard at compile time. // constant expression to assert size equality as a safeguard at compile time.
// How it works: the difference of both sizes is converted into an 8 bit value // How it works: if sizes are different, either the inner or outer expression is
// and left-bit-shifted by 8. This always creates an overflow error at compile // negative, which always fails with "constant ... overflows uintptr", because
// time, if the difference of the sizes is not 0. // unsafe.Sizeof() is a uintptr typed constant.
const _ = uint8(unsafe.Sizeof(uintptr(0))-PtrSize) << 8 // size assert const _ = -(unsafe.Sizeof(uintptr(0)) - PtrSize) // size assert
func uintptrPtr(p *CPtr) *uintptr { func uintptrPtr(p *CPtr) *uintptr {
return (*uintptr)(unsafe.Pointer(p)) return (*uintptr)(unsafe.Pointer(p))
} }

View File

@ -1,3 +1,4 @@
//go:build ptrguard
// +build ptrguard // +build ptrguard
package cutil package cutil

View File

@ -1,3 +1,4 @@
//go:build !ptrguard
// +build !ptrguard // +build !ptrguard
package cutil package cutil

View File

@ -14,6 +14,8 @@ import (
var argvPlaceholder = "placeholder" var argvPlaceholder = "placeholder"
//revive:disable:var-naming old-yet-exported public api
// ClusterStat represents Ceph cluster statistics. // ClusterStat represents Ceph cluster statistics.
type ClusterStat struct { type ClusterStat struct {
Kb uint64 Kb uint64
@ -22,6 +24,8 @@ type ClusterStat struct {
Num_objects uint64 Num_objects uint64
} }
//revive:enable:var-naming
// Conn is a connection handle to a Ceph cluster. // Conn is a connection handle to a Ceph cluster.
type Conn struct { type Conn struct {
cluster C.rados_t cluster C.rados_t
@ -67,7 +71,7 @@ func (c *Conn) Connect() error {
// Shutdown disconnects from the cluster. // Shutdown disconnects from the cluster.
func (c *Conn) Shutdown() { func (c *Conn) Shutdown() {
if err := c.ensure_connected(); err != nil { if err := c.ensureConnected(); err != nil {
return return
} }
freeConn(c) freeConn(c)
@ -166,7 +170,7 @@ func (c *Conn) WaitForLatestOSDMap() error {
return getError(ret) return getError(ret)
} }
func (c *Conn) ensure_connected() error { func (c *Conn) ensureConnected() error {
if c.connected { if c.connected {
return nil return nil
} }
@ -176,7 +180,7 @@ func (c *Conn) ensure_connected() error {
// GetClusterStats returns statistics about the cluster associated with the // GetClusterStats returns statistics about the cluster associated with the
// connection. // connection.
func (c *Conn) GetClusterStats() (stat ClusterStat, err error) { func (c *Conn) GetClusterStats() (stat ClusterStat, err error) {
if err := c.ensure_connected(); err != nil { if err := c.ensureConnected(); err != nil {
return ClusterStat{}, err return ClusterStat{}, err
} }
cStat := C.struct_rados_cluster_stat_t{} cStat := C.struct_rados_cluster_stat_t{}
@ -269,7 +273,7 @@ func (c *Conn) MakePool(name string) error {
// DeletePool deletes a pool and all the data inside the pool. // DeletePool deletes a pool and all the data inside the pool.
func (c *Conn) DeletePool(name string) error { func (c *Conn) DeletePool(name string) error {
if err := c.ensure_connected(); err != nil { if err := c.ensureConnected(); err != nil {
return err return err
} }
cName := C.CString(name) cName := C.CString(name)
@ -280,7 +284,7 @@ func (c *Conn) DeletePool(name string) error {
// GetPoolByName returns the ID of the pool with a given name. // GetPoolByName returns the ID of the pool with a given name.
func (c *Conn) GetPoolByName(name string) (int64, error) { func (c *Conn) GetPoolByName(name string) (int64, error) {
if err := c.ensure_connected(); err != nil { if err := c.ensureConnected(); err != nil {
return 0, err return 0, err
} }
cName := C.CString(name) cName := C.CString(name)
@ -295,7 +299,7 @@ func (c *Conn) GetPoolByName(name string) (int64, error) {
// GetPoolByID returns the name of a pool by a given ID. // GetPoolByID returns the name of a pool by a given ID.
func (c *Conn) GetPoolByID(id int64) (string, error) { func (c *Conn) GetPoolByID(id int64) (string, error) {
buf := make([]byte, 4096) buf := make([]byte, 4096)
if err := c.ensure_connected(); err != nil { if err := c.ensureConnected(); err != nil {
return "", err return "", err
} }
cid := C.int64_t(id) cid := C.int64_t(id)

View File

@ -45,6 +45,8 @@ const (
CreateIdempotent = C.LIBRADOS_CREATE_IDEMPOTENT CreateIdempotent = C.LIBRADOS_CREATE_IDEMPOTENT
) )
//revive:disable:var-naming old-yet-exported public api
// PoolStat represents Ceph pool statistics. // PoolStat represents Ceph pool statistics.
type PoolStat struct { type PoolStat struct {
// space used in bytes // space used in bytes
@ -69,6 +71,8 @@ type PoolStat struct {
Num_wr_kb uint64 Num_wr_kb uint64
} }
//revive:enable:var-naming
// ObjectStat represents an object stat information // ObjectStat represents an object stat information
type ObjectStat struct { type ObjectStat struct {
// current length in bytes // current length in bytes

View File

@ -1,3 +1,4 @@
//go:build nautilus
// +build nautilus // +build nautilus
package rados package rados

View File

@ -1,3 +1,4 @@
//go:build !nautilus
// +build !nautilus // +build !nautilus
package rados package rados

View File

@ -1,3 +1,4 @@
//go:build !mimic
// +build !mimic // +build !mimic
package rados package rados

View File

@ -1,3 +1,4 @@
//go:build !nautilus
// +build !nautilus // +build !nautilus
package admin package admin

46
vendor/github.com/ceph/go-ceph/rbd/admin/imagespec.go generated vendored Normal file
View File

@ -0,0 +1,46 @@
//go:build !nautilus && ceph_preview
// +build !nautilus,ceph_preview
package admin
import (
"fmt"
)
// ImageSpec values are used to identify an RBD image wherever Ceph APIs
// require an image_spec/image_id_spec using image name/id and optional
// pool and namespace.
// PREVIEW
type ImageSpec struct {
spec string
}
// NewImageSpec is used to construct an ImageSpec given an image name/id
// and optional namespace and pool names.
// PREVIEW
//
// NewImageSpec constructs an ImageSpec to identify an RBD image and thus
// requires image name/id, whereas NewLevelSpec constructs LevelSpec to
// identify entire pool, pool namespace or single RBD image, all of which
// requires pool name.
func NewImageSpec(pool, namespace, image string) ImageSpec {
var s string
if pool != "" && namespace != "" {
s = fmt.Sprintf("%s/%s/%s", pool, namespace, image)
} else if pool != "" {
s = fmt.Sprintf("%s/%s", pool, image)
} else {
s = image
}
return ImageSpec{s}
}
// NewRawImageSpec returns a ImageSpec directly based on the spec string
// argument without constructing it from component values.
// PREVIEW
//
// This should only be used if NewImageSpec can not create the imagespec value
// you want to pass to ceph.
func NewRawImageSpec(spec string) ImageSpec {
return ImageSpec{spec}
}

View File

@ -1,3 +1,4 @@
//go:build !nautilus
// +build !nautilus // +build !nautilus
package admin package admin

143
vendor/github.com/ceph/go-ceph/rbd/admin/task.go generated vendored Normal file
View File

@ -0,0 +1,143 @@
//go:build !nautilus && ceph_preview
// +build !nautilus,ceph_preview
package admin
import (
ccom "github.com/ceph/go-ceph/common/commands"
"github.com/ceph/go-ceph/internal/commands"
)
// TaskAdmin encapsulates management functions for ceph rbd task operations.
// PREVIEW
type TaskAdmin struct {
conn ccom.MgrCommander
}
// Task returns a TaskAdmin type for managing ceph rbd task operations.
// PREVIEW
func (ra *RBDAdmin) Task() *TaskAdmin {
return &TaskAdmin{conn: ra.conn}
}
// TaskRefs contains the action name and information about the image.
// PREVIEW
type TaskRefs struct {
Action string `json:"action"`
PoolName string `json:"pool_name"`
PoolNamespace string `json:"pool_namespace"`
ImageName string `json:"image_name"`
ImageID string `json:"image_id"`
}
// TaskResponse contains the information about the task added on an image.
// PREVIEW
type TaskResponse struct {
Sequence int `json:"sequence"`
ID string `json:"id"`
Message string `json:"message"`
Refs TaskRefs `json:"refs"`
InProgress bool `json:"in_progress"`
Progress float64 `json:"progress"`
RetryAttempts int `json:"retry_attempts"`
RetryTime string `json:"retry_time"`
RetryMessage string `json:"retry_message"`
}
func parseTaskResponse(res commands.Response) (TaskResponse, error) {
var taskResponse TaskResponse
err := res.NoStatus().Unmarshal(&taskResponse).End()
return taskResponse, err
}
func parseTaskResponseList(res commands.Response) ([]TaskResponse, error) {
var taskResponseList []TaskResponse
err := res.NoStatus().Unmarshal(&taskResponseList).End()
return taskResponseList, err
}
// AddFlatten adds a background task to flatten a cloned image based on the
// supplied image spec.
// PREVIEW
//
// Similar To:
// rbd task add flatten <image_spec>
func (ta *TaskAdmin) AddFlatten(img ImageSpec) (TaskResponse, error) {
m := map[string]string{
"prefix": "rbd task add flatten",
"image_spec": img.spec,
"format": "json",
}
return parseTaskResponse(commands.MarshalMgrCommand(ta.conn, m))
}
// AddRemove adds a background task to remove an image based on the supplied
// image spec.
// PREVIEW
//
// Similar To:
// rbd task add remove <image_spec>
func (ta *TaskAdmin) AddRemove(img ImageSpec) (TaskResponse, error) {
m := map[string]string{
"prefix": "rbd task add remove",
"image_spec": img.spec,
"format": "json",
}
return parseTaskResponse(commands.MarshalMgrCommand(ta.conn, m))
}
// AddTrashRemove adds a background task to remove an image from the trash based
// on the supplied image id spec.
// PREVIEW
//
// Similar To:
// rbd task add trash remove <image_id_spec>
func (ta *TaskAdmin) AddTrashRemove(img ImageSpec) (TaskResponse, error) {
m := map[string]string{
"prefix": "rbd task add trash remove",
"image_id_spec": img.spec,
"format": "json",
}
return parseTaskResponse(commands.MarshalMgrCommand(ta.conn, m))
}
// List pending or running asynchronous tasks.
// PREVIEW
//
// Similar To:
// rbd task list
func (ta *TaskAdmin) List() ([]TaskResponse, error) {
m := map[string]string{
"prefix": "rbd task list",
"format": "json",
}
return parseTaskResponseList(commands.MarshalMgrCommand(ta.conn, m))
}
// GetTaskByID returns pending or running asynchronous task using id.
// PREVIEW
//
// Similar To:
// rbd task list <task_id>
func (ta *TaskAdmin) GetTaskByID(taskID string) (TaskResponse, error) {
m := map[string]string{
"prefix": "rbd task list",
"task_id": taskID,
"format": "json",
}
return parseTaskResponse(commands.MarshalMgrCommand(ta.conn, m))
}
// Cancel a pending or running asynchronous task.
// PREVIEW
//
// Similar To:
// rbd task cancel <task_id>
func (ta *TaskAdmin) Cancel(taskID string) (TaskResponse, error) {
m := map[string]string{
"prefix": "rbd task cancel",
"task_id": taskID,
"format": "json",
}
return parseTaskResponse(commands.MarshalMgrCommand(ta.conn, m))
}

View File

@ -1,3 +1,4 @@
//go:build !octopus && !nautilus
// +build !octopus,!nautilus // +build !octopus,!nautilus
package rbd package rbd

View File

@ -1,3 +1,4 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
package rbd package rbd

View File

@ -21,8 +21,8 @@ func (image *Image) GetMetadata(key string) (string, error) {
return "", err return "", err
} }
c_key := C.CString(key) cKey := C.CString(key)
defer C.free(unsafe.Pointer(c_key)) defer C.free(unsafe.Pointer(cKey))
var ( var (
buf []byte buf []byte
@ -34,7 +34,7 @@ func (image *Image) GetMetadata(key string) (string, error) {
// rbd_metadata_get is a bit quirky and *does not* update the size // rbd_metadata_get is a bit quirky and *does not* update the size
// value if the size passed in >= the needed size. // value if the size passed in >= the needed size.
ret := C.rbd_metadata_get( ret := C.rbd_metadata_get(
image.image, c_key, (*C.char)(unsafe.Pointer(&buf[0])), &csize) image.image, cKey, (*C.char)(unsafe.Pointer(&buf[0])), &csize)
err = getError(ret) err = getError(ret)
return retry.Size(int(csize)).If(err == errRange) return retry.Size(int(csize)).If(err == errRange)
}) })
@ -53,12 +53,12 @@ func (image *Image) SetMetadata(key string, value string) error {
return err return err
} }
c_key := C.CString(key) cKey := C.CString(key)
c_value := C.CString(value) cValue := C.CString(value)
defer C.free(unsafe.Pointer(c_key)) defer C.free(unsafe.Pointer(cKey))
defer C.free(unsafe.Pointer(c_value)) defer C.free(unsafe.Pointer(cValue))
ret := C.rbd_metadata_set(image.image, c_key, c_value) ret := C.rbd_metadata_set(image.image, cKey, cValue)
if ret < 0 { if ret < 0 {
return rbdError(ret) return rbdError(ret)
} }
@ -75,10 +75,10 @@ func (image *Image) RemoveMetadata(key string) error {
return err return err
} }
c_key := C.CString(key) cKey := C.CString(key)
defer C.free(unsafe.Pointer(c_key)) defer C.free(unsafe.Pointer(cKey))
ret := C.rbd_metadata_remove(image.image, c_key) ret := C.rbd_metadata_remove(image.image, cKey)
if ret < 0 { if ret < 0 {
return rbdError(ret) return rbdError(ret)
} }

View File

@ -1,3 +1,4 @@
//go:build !nautilus
// +build !nautilus // +build !nautilus
// Initially, we're only providing mirroring related functions for octopus as // Initially, we're only providing mirroring related functions for octopus as
@ -746,7 +747,9 @@ func (iter *MirrorImageGlobalStatusIter) Next() (*GlobalMirrorImageIDAndStatus,
} }
// Close terminates iteration regardless if iteration was completed and // Close terminates iteration regardless if iteration was completed and
// frees any associated resources. (DEPRECATED) // frees any associated resources.
//
// Deprecated: not required
func (*MirrorImageGlobalStatusIter) Close() error { func (*MirrorImageGlobalStatusIter) Close() error {
return nil return nil
} }
@ -908,3 +911,132 @@ func (iter *MirrorImageInfoIter) fetch() error {
} }
return nil return nil
} }
// MirrorImageInstanceIDItem contains an ID string for a RBD image and
// its corresponding mirrored image's Instance ID.
type MirrorImageInstanceIDItem struct {
ID string
InstanceID string
}
// MirrorImageInstanceIDList returns a slice of MirrorImageInstanceIDItem. If
// the length of the returned slice equals max, the next chunk of the list can
// be obtained by setting start to the ID of the last item of the returned slice.
// If max is 0 a slice of all items is returned.
//
// Implements:
// int rbd_mirror_image_instance_id_list(
// rados_ioctx_t io_ctx,
// const char *start_id,
// size_t max, char **image_ids,
// char **instance_ids,
// size_t *len)
func MirrorImageInstanceIDList(
ioctx *rados.IOContext, start string,
max int) ([]MirrorImageInstanceIDItem, error) {
var (
result []MirrorImageInstanceIDItem
fetchAll bool
)
if max <= 0 {
max = iterBufSize
fetchAll = true
}
chunk := make([]MirrorImageInstanceIDItem, max)
for {
length, err := mirrorImageInstanceIDList(ioctx, start, chunk)
if err != nil {
return nil, err
}
result = append(result, chunk[:length]...)
if !fetchAll || length < max {
break
}
start = chunk[length-1].ID
}
return result, nil
}
func mirrorImageInstanceIDList(ioctx *rados.IOContext, start string,
results []MirrorImageInstanceIDItem) (int, error) {
cStart := C.CString(start)
defer C.free(unsafe.Pointer(cStart))
var (
max = C.size_t(len(results))
length = C.size_t(0)
ids = make([]*C.char, len(results))
instanceIDs = make([]*C.char, len(results))
)
ret := C.rbd_mirror_image_instance_id_list(
cephIoctx(ioctx),
cStart,
max,
&ids[0],
&instanceIDs[0],
&length,
)
if err := getError(ret); err != nil {
return 0, err
}
for i := 0; i < int(length); i++ {
results[i].ID = C.GoString(ids[i])
results[i].InstanceID = C.GoString(instanceIDs[i])
}
C.rbd_mirror_image_instance_id_list_cleanup(
&ids[0],
&instanceIDs[0],
length)
return int(length), getError(ret)
}
// MirrorImageInstanceIDIter provide methods for iterating over all
// the MirrorImageInstanceIDItem values in a pool.
type MirrorImageInstanceIDIter struct {
ioctx *rados.IOContext
buf []MirrorImageInstanceIDItem
lastID string
}
// NewMirrorImageInstanceIDIter creates a new iterator ready for use.
func NewMirrorImageInstanceIDIter(ioctx *rados.IOContext) *MirrorImageInstanceIDIter {
return &MirrorImageInstanceIDIter{
ioctx: ioctx,
}
}
// Next fetches one MirrorImageInstanceIDItem value or a nil value if iteration is
// exhausted. The error return will be non-nil if an underlying error fetching
// more values occurred.
func (iter *MirrorImageInstanceIDIter) Next() (*MirrorImageInstanceIDItem, error) {
if len(iter.buf) == 0 {
if err := iter.fetch(); err != nil {
return nil, err
}
if len(iter.buf) == 0 {
return nil, nil
}
iter.lastID = iter.buf[len(iter.buf)-1].ID
}
item := iter.buf[0]
iter.buf = iter.buf[1:]
return &item, nil
}
func (iter *MirrorImageInstanceIDIter) fetch() error {
iter.buf = nil
items := make([]MirrorImageInstanceIDItem, iterBufSize)
n, err := mirrorImageInstanceIDList(
iter.ioctx,
iter.lastID,
items)
if err != nil {
return err
}
if n > 0 {
iter.buf = items[:n]
}
return nil
}

View File

@ -1,4 +1,6 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
// //
// Ceph Nautilus is the first release that includes rbd_namespace_create(), // Ceph Nautilus is the first release that includes rbd_namespace_create(),
// rbd_namespace_remove(), rbd_namespace_exists() and rbd_namespace_list(). // rbd_namespace_remove(), rbd_namespace_exists() and rbd_namespace_list().

View File

@ -120,10 +120,10 @@ func (rio *ImageOptions) Destroy() {
// int rbd_image_options_set_string(rbd_image_options_t opts, int optname, // int rbd_image_options_set_string(rbd_image_options_t opts, int optname,
// const char* optval); // const char* optval);
func (rio *ImageOptions) SetString(option ImageOption, value string) error { func (rio *ImageOptions) SetString(option ImageOption, value string) error {
c_value := C.CString(value) cValue := C.CString(value)
defer C.free(unsafe.Pointer(c_value)) defer C.free(unsafe.Pointer(cValue))
ret := C.rbd_image_options_set_string(rio.options, C.int(option), c_value) ret := C.rbd_image_options_set_string(rio.options, C.int(option), cValue)
if ret != 0 { if ret != 0 {
return fmt.Errorf("%v, could not set option %v to \"%v\"", return fmt.Errorf("%v, could not set option %v to \"%v\"",
getError(ret), option, value) getError(ret), option, value)
@ -156,9 +156,9 @@ func (rio *ImageOptions) GetString(option ImageOption) (string, error) {
// int rbd_image_options_set_uint64(rbd_image_options_t opts, int optname, // int rbd_image_options_set_uint64(rbd_image_options_t opts, int optname,
// const uint64_t optval); // const uint64_t optval);
func (rio *ImageOptions) SetUint64(option ImageOption, value uint64) error { func (rio *ImageOptions) SetUint64(option ImageOption, value uint64) error {
c_value := C.uint64_t(value) cValue := C.uint64_t(value)
ret := C.rbd_image_options_set_uint64(rio.options, C.int(option), c_value) ret := C.rbd_image_options_set_uint64(rio.options, C.int(option), cValue)
if ret != 0 { if ret != 0 {
return fmt.Errorf("%v, could not set option %v to \"%v\"", return fmt.Errorf("%v, could not set option %v to \"%v\"",
getError(ret), option, value) getError(ret), option, value)
@ -173,14 +173,14 @@ func (rio *ImageOptions) SetUint64(option ImageOption, value uint64) error {
// int rbd_image_options_get_uint64(rbd_image_options_t opts, int optname, // int rbd_image_options_get_uint64(rbd_image_options_t opts, int optname,
// uint64_t* optval); // uint64_t* optval);
func (rio *ImageOptions) GetUint64(option ImageOption) (uint64, error) { func (rio *ImageOptions) GetUint64(option ImageOption) (uint64, error) {
var c_value C.uint64_t var cValue C.uint64_t
ret := C.rbd_image_options_get_uint64(rio.options, C.int(option), &c_value) ret := C.rbd_image_options_get_uint64(rio.options, C.int(option), &cValue)
if ret != 0 { if ret != 0 {
return 0, fmt.Errorf("%v, could not get option %v", getError(ret), option) return 0, fmt.Errorf("%v, could not get option %v", getError(ret), option)
} }
return uint64(c_value), nil return uint64(cValue), nil
} }
// IsSet returns a true if the RbdImageOption is set, false otherwise. // IsSet returns a true if the RbdImageOption is set, false otherwise.
@ -189,14 +189,14 @@ func (rio *ImageOptions) GetUint64(option ImageOption) (uint64, error) {
// int rbd_image_options_is_set(rbd_image_options_t opts, int optname, // int rbd_image_options_is_set(rbd_image_options_t opts, int optname,
// bool* is_set); // bool* is_set);
func (rio *ImageOptions) IsSet(option ImageOption) (bool, error) { func (rio *ImageOptions) IsSet(option ImageOption) (bool, error) {
var c_set C.bool var cSet C.bool
ret := C.rbd_image_options_is_set(rio.options, C.int(option), &c_set) ret := C.rbd_image_options_is_set(rio.options, C.int(option), &cSet)
if ret != 0 { if ret != 0 {
return false, fmt.Errorf("%v, could not check option %v", getError(ret), option) return false, fmt.Errorf("%v, could not check option %v", getError(ret), option)
} }
return bool(c_set), nil return bool(cSet), nil
} }
// Unset a given RbdImageOption. // Unset a given RbdImageOption.

View File

@ -1,3 +1,4 @@
//go:build !nautilus
// +build !nautilus // +build !nautilus
package rbd package rbd

View File

@ -1,4 +1,6 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
// //
// Ceph Nautilus is the first release that includes rbd_pool_metadata_get(), // Ceph Nautilus is the first release that includes rbd_pool_metadata_get(),
// rbd_pool_metadata_set() and rbd_pool_metadata_remove(). // rbd_pool_metadata_set() and rbd_pool_metadata_remove().

View File

@ -49,6 +49,8 @@ const (
// Timespec is a public type for the internal C 'struct timespec' // Timespec is a public type for the internal C 'struct timespec'
type Timespec ts.Timespec type Timespec ts.Timespec
// revive:disable:var-naming old-yet-exported public api
// ImageInfo represents the status information for an image. // ImageInfo represents the status information for an image.
type ImageInfo struct { type ImageInfo struct {
Size uint64 Size uint64
@ -58,6 +60,8 @@ type ImageInfo struct {
Block_name_prefix string Block_name_prefix string
} }
// revive:enable:var-naming
// SnapInfo represents the status information for a snapshot. // SnapInfo represents the status information for a snapshot.
type SnapInfo struct { type SnapInfo struct {
Id uint64 Id uint64
@ -125,9 +129,9 @@ func (image *Image) validate(req uint32) error {
// Version returns the major, minor, and patch level of the librbd library. // Version returns the major, minor, and patch level of the librbd library.
func Version() (int, int, int) { func Version() (int, int, int) {
var c_major, c_minor, c_patch C.int var cMajor, cMinor, cPatch C.int
C.rbd_version(&c_major, &c_minor, &c_patch) C.rbd_version(&cMajor, &cMinor, &cPatch)
return int(c_major), int(c_minor), int(c_patch) return int(cMajor), int(cMinor), int(cPatch)
} }
// GetImage gets a reference to a previously created rbd image. // GetImage gets a reference to a previously created rbd image.
@ -160,13 +164,13 @@ func Create(ioctx *rados.IOContext, name string, size uint64, order int,
case 1: case 1:
return Create2(ioctx, name, size, args[0], order) return Create2(ioctx, name, size, args[0], order)
case 0: case 0:
c_order := C.int(order) cOrder := C.int(order)
c_name := C.CString(name) cName := C.CString(name)
defer C.free(unsafe.Pointer(c_name)) defer C.free(unsafe.Pointer(cName))
ret = C.rbd_create(cephIoctx(ioctx), ret = C.rbd_create(cephIoctx(ioctx),
c_name, C.uint64_t(size), &c_order) cName, C.uint64_t(size), &cOrder)
default: default:
return nil, errors.New("Wrong number of argument") return nil, errors.New("Wrong number of argument")
} }
@ -190,13 +194,13 @@ func Create2(ioctx *rados.IOContext, name string, size uint64, features uint64,
order int) (image *Image, err error) { order int) (image *Image, err error) {
var ret C.int var ret C.int
c_order := C.int(order) cOrder := C.int(order)
c_name := C.CString(name) cName := C.CString(name)
defer C.free(unsafe.Pointer(c_name)) defer C.free(unsafe.Pointer(cName))
ret = C.rbd_create2(cephIoctx(ioctx), c_name, ret = C.rbd_create2(cephIoctx(ioctx), cName,
C.uint64_t(size), C.uint64_t(features), &c_order) C.uint64_t(size), C.uint64_t(features), &cOrder)
if ret < 0 { if ret < 0 {
return nil, rbdError(ret) return nil, rbdError(ret)
} }
@ -215,17 +219,17 @@ func Create2(ioctx *rados.IOContext, name string, size uint64, features uint64,
// uint64_t features, int *order, // uint64_t features, int *order,
// uint64_t stripe_unit, uint64_t stripe_count); // uint64_t stripe_unit, uint64_t stripe_count);
func Create3(ioctx *rados.IOContext, name string, size uint64, features uint64, func Create3(ioctx *rados.IOContext, name string, size uint64, features uint64,
order int, stripe_unit uint64, stripe_count uint64) (image *Image, err error) { order int, stripeUnit uint64, stripeCount uint64) (image *Image, err error) {
var ret C.int var ret C.int
c_order := C.int(order) cOrder := C.int(order)
c_name := C.CString(name) cName := C.CString(name)
defer C.free(unsafe.Pointer(c_name)) defer C.free(unsafe.Pointer(cName))
ret = C.rbd_create3(cephIoctx(ioctx), c_name, ret = C.rbd_create3(cephIoctx(ioctx), cName,
C.uint64_t(size), C.uint64_t(features), &c_order, C.uint64_t(size), C.uint64_t(features), &cOrder,
C.uint64_t(stripe_unit), C.uint64_t(stripe_count)) C.uint64_t(stripeUnit), C.uint64_t(stripeCount))
if ret < 0 { if ret < 0 {
return nil, rbdError(ret) return nil, rbdError(ret)
} }
@ -242,31 +246,35 @@ func Create3(ioctx *rados.IOContext, name string, size uint64, features uint64,
// int rbd_clone(rados_ioctx_t p_ioctx, const char *p_name, // int rbd_clone(rados_ioctx_t p_ioctx, const char *p_name,
// const char *p_snapname, rados_ioctx_t c_ioctx, // const char *p_snapname, rados_ioctx_t c_ioctx,
// const char *c_name, uint64_t features, int *c_order); // const char *c_name, uint64_t features, int *c_order);
func (image *Image) Clone(snapname string, c_ioctx *rados.IOContext, c_name string, features uint64, order int) (*Image, error) { func (image *Image) Clone(snapname string, cIoctx *rados.IOContext, cName string, features uint64, order int) (*Image, error) {
if err := image.validate(imageNeedsIOContext); err != nil { if err := image.validate(imageNeedsIOContext); err != nil {
return nil, err return nil, err
} }
c_order := C.int(order) cOrder := C.int(order)
c_p_name := C.CString(image.name) cParentName := C.CString(image.name)
c_p_snapname := C.CString(snapname) cParentSnapName := C.CString(snapname)
c_c_name := C.CString(c_name) cCloneName := C.CString(cName)
defer C.free(unsafe.Pointer(c_p_name)) defer C.free(unsafe.Pointer(cParentName))
defer C.free(unsafe.Pointer(c_p_snapname)) defer C.free(unsafe.Pointer(cParentSnapName))
defer C.free(unsafe.Pointer(c_c_name)) defer C.free(unsafe.Pointer(cCloneName))
ret := C.rbd_clone(cephIoctx(image.ioctx), ret := C.rbd_clone(
c_p_name, c_p_snapname, cephIoctx(image.ioctx),
cephIoctx(c_ioctx), cParentName,
c_c_name, C.uint64_t(features), &c_order) cParentSnapName,
cephIoctx(cIoctx),
cCloneName,
C.uint64_t(features),
&cOrder)
if ret < 0 { if ret < 0 {
return nil, rbdError(ret) return nil, rbdError(ret)
} }
return &Image{ return &Image{
ioctx: c_ioctx, ioctx: cIoctx,
name: c_name, name: cName,
}, nil }, nil
} }
@ -288,10 +296,10 @@ func (image *Image) Trash(delay time.Duration) error {
return err return err
} }
c_name := C.CString(image.name) cName := C.CString(image.name)
defer C.free(unsafe.Pointer(c_name)) defer C.free(unsafe.Pointer(cName))
return getError(C.rbd_trash_move(cephIoctx(image.ioctx), c_name, return getError(C.rbd_trash_move(cephIoctx(image.ioctx), cName,
C.uint64_t(delay.Seconds()))) C.uint64_t(delay.Seconds())))
} }
@ -304,14 +312,14 @@ func (image *Image) Rename(destname string) error {
return err return err
} }
c_srcname := C.CString(image.name) cSrcName := C.CString(image.name)
c_destname := C.CString(destname) cDestName := C.CString(destname)
defer C.free(unsafe.Pointer(c_srcname)) defer C.free(unsafe.Pointer(cSrcName))
defer C.free(unsafe.Pointer(c_destname)) defer C.free(unsafe.Pointer(cDestName))
err := rbdError(C.rbd_rename(cephIoctx(image.ioctx), err := rbdError(C.rbd_rename(cephIoctx(image.ioctx),
c_srcname, c_destname)) cSrcName, cDestName))
if err == 0 { if err == 0 {
image.name = destname image.name = destname
return nil return nil
@ -321,9 +329,7 @@ func (image *Image) Rename(destname string) error {
// Open the rbd image. // Open the rbd image.
// //
// Deprecated: The Open function was provided in earlier versions of the API // Deprecated: use OpenImage and OpenImageReadOnly instead
// and now exists to support older code. The use of OpenImage and
// OpenImageReadOnly is preferred.
func (image *Image) Open(args ...interface{}) error { func (image *Image) Open(args ...interface{}) error {
if err := image.validate(imageNeedsIOContext | imageNeedsName); err != nil { if err := image.validate(imageNeedsIOContext | imageNeedsName); err != nil {
return err return err
@ -399,37 +405,37 @@ func (image *Image) Stat() (info *ImageInfo, err error) {
return nil, err return nil, err
} }
var c_stat C.rbd_image_info_t var cStat C.rbd_image_info_t
if ret := C.rbd_stat(image.image, &c_stat, C.size_t(unsafe.Sizeof(info))); ret < 0 { if ret := C.rbd_stat(image.image, &cStat, C.size_t(unsafe.Sizeof(info))); ret < 0 {
return info, rbdError(ret) return info, rbdError(ret)
} }
return &ImageInfo{ return &ImageInfo{
Size: uint64(c_stat.size), Size: uint64(cStat.size),
Obj_size: uint64(c_stat.obj_size), Obj_size: uint64(cStat.obj_size),
Num_objs: uint64(c_stat.num_objs), Num_objs: uint64(cStat.num_objs),
Order: int(c_stat.order), Order: int(cStat.order),
Block_name_prefix: C.GoString((*C.char)(&c_stat.block_name_prefix[0]))}, nil Block_name_prefix: C.GoString((*C.char)(&cStat.block_name_prefix[0]))}, nil
} }
// IsOldFormat returns true if the rbd image uses the old format. // IsOldFormat returns true if the rbd image uses the old format.
// //
// Implements: // Implements:
// int rbd_get_old_format(rbd_image_t image, uint8_t *old); // int rbd_get_old_format(rbd_image_t image, uint8_t *old);
func (image *Image) IsOldFormat() (old_format bool, err error) { func (image *Image) IsOldFormat() (bool, error) {
if err := image.validate(imageIsOpen); err != nil { if err := image.validate(imageIsOpen); err != nil {
return false, err return false, err
} }
var c_old_format C.uint8_t var cOldFormat C.uint8_t
ret := C.rbd_get_old_format(image.image, ret := C.rbd_get_old_format(image.image,
&c_old_format) &cOldFormat)
if ret < 0 { if ret < 0 {
return false, rbdError(ret) return false, rbdError(ret)
} }
return c_old_format != 0, nil return cOldFormat != 0, nil
} }
// GetSize returns the size of the rbd image. // GetSize returns the size of the rbd image.
@ -452,32 +458,34 @@ func (image *Image) GetSize() (size uint64, err error) {
// //
// Implements: // Implements:
// int rbd_get_stripe_unit(rbd_image_t image, uint64_t *stripe_unit); // int rbd_get_stripe_unit(rbd_image_t image, uint64_t *stripe_unit);
func (image *Image) GetStripeUnit() (stripe_unit uint64, err error) { func (image *Image) GetStripeUnit() (uint64, error) {
if err := image.validate(imageIsOpen); err != nil { if err := image.validate(imageIsOpen); err != nil {
return 0, err return 0, err
} }
if ret := C.rbd_get_stripe_unit(image.image, (*C.uint64_t)(&stripe_unit)); ret < 0 { var stripeUnit uint64
if ret := C.rbd_get_stripe_unit(image.image, (*C.uint64_t)(&stripeUnit)); ret < 0 {
return 0, rbdError(ret) return 0, rbdError(ret)
} }
return stripe_unit, nil return stripeUnit, nil
} }
// GetStripeCount returns the stripe-count value for the rbd image. // GetStripeCount returns the stripe-count value for the rbd image.
// //
// Implements: // Implements:
// int rbd_get_stripe_count(rbd_image_t image, uint64_t *stripe_count); // int rbd_get_stripe_count(rbd_image_t image, uint64_t *stripe_count);
func (image *Image) GetStripeCount() (stripe_count uint64, err error) { func (image *Image) GetStripeCount() (uint64, error) {
if err := image.validate(imageIsOpen); err != nil { if err := image.validate(imageIsOpen); err != nil {
return 0, err return 0, err
} }
if ret := C.rbd_get_stripe_count(image.image, (*C.uint64_t)(&stripe_count)); ret < 0 { var stripeCount uint64
if ret := C.rbd_get_stripe_count(image.image, (*C.uint64_t)(&stripeCount)); ret < 0 {
return 0, rbdError(ret) return 0, rbdError(ret)
} }
return stripe_count, nil return stripeCount, nil
} }
// GetOverlap returns the overlapping bytes between the rbd image and its // GetOverlap returns the overlapping bytes between the rbd image and its
@ -510,11 +518,11 @@ func (image *Image) Copy(ioctx *rados.IOContext, destname string) error {
return ErrNoName return ErrNoName
} }
c_destname := C.CString(destname) cDestName := C.CString(destname)
defer C.free(unsafe.Pointer(c_destname)) defer C.free(unsafe.Pointer(cDestName))
return getError(C.rbd_copy(image.image, return getError(C.rbd_copy(image.image,
cephIoctx(ioctx), c_destname)) cephIoctx(ioctx), cDestName))
} }
// Copy2 copies one rbd image to another, using an image handle. // Copy2 copies one rbd image to another, using an image handle.
@ -583,55 +591,55 @@ func (image *Image) ListLockers() (tag string, lockers []Locker, err error) {
return "", nil, err return "", nil, err
} }
var c_exclusive C.int var cExclusive C.int
var c_tag_len, c_clients_len, c_cookies_len, c_addrs_len C.size_t var cTagLen, cClientsLen, cCookiesLen, cAddrsLen C.size_t
var c_locker_cnt C.ssize_t var cLockerCount C.ssize_t
C.rbd_list_lockers(image.image, &c_exclusive, C.rbd_list_lockers(image.image, &cExclusive,
nil, (*C.size_t)(&c_tag_len), nil, (*C.size_t)(&cTagLen),
nil, (*C.size_t)(&c_clients_len), nil, (*C.size_t)(&cClientsLen),
nil, (*C.size_t)(&c_cookies_len), nil, (*C.size_t)(&cCookiesLen),
nil, (*C.size_t)(&c_addrs_len)) nil, (*C.size_t)(&cAddrsLen))
// no locker held on rbd image when either c_clients_len, // no locker held on rbd image when either c_clients_len,
// c_cookies_len or c_addrs_len is *0*, so just quickly returned // c_cookies_len or c_addrs_len is *0*, so just quickly returned
if int(c_clients_len) == 0 || int(c_cookies_len) == 0 || if int(cClientsLen) == 0 || int(cCookiesLen) == 0 ||
int(c_addrs_len) == 0 { int(cAddrsLen) == 0 {
lockers = make([]Locker, 0) lockers = make([]Locker, 0)
return "", lockers, nil return "", lockers, nil
} }
tag_buf := make([]byte, c_tag_len) tagBuf := make([]byte, cTagLen)
clients_buf := make([]byte, c_clients_len) clientsBuf := make([]byte, cClientsLen)
cookies_buf := make([]byte, c_cookies_len) cookiesBuf := make([]byte, cCookiesLen)
addrs_buf := make([]byte, c_addrs_len) addrsBuf := make([]byte, cAddrsLen)
c_locker_cnt = C.rbd_list_lockers(image.image, &c_exclusive, cLockerCount = C.rbd_list_lockers(image.image, &cExclusive,
(*C.char)(unsafe.Pointer(&tag_buf[0])), (*C.size_t)(&c_tag_len), (*C.char)(unsafe.Pointer(&tagBuf[0])), (*C.size_t)(&cTagLen),
(*C.char)(unsafe.Pointer(&clients_buf[0])), (*C.size_t)(&c_clients_len), (*C.char)(unsafe.Pointer(&clientsBuf[0])), (*C.size_t)(&cClientsLen),
(*C.char)(unsafe.Pointer(&cookies_buf[0])), (*C.size_t)(&c_cookies_len), (*C.char)(unsafe.Pointer(&cookiesBuf[0])), (*C.size_t)(&cCookiesLen),
(*C.char)(unsafe.Pointer(&addrs_buf[0])), (*C.size_t)(&c_addrs_len)) (*C.char)(unsafe.Pointer(&addrsBuf[0])), (*C.size_t)(&cAddrsLen))
// rbd_list_lockers returns negative value for errors // rbd_list_lockers returns negative value for errors
// and *0* means no locker held on rbd image. // and *0* means no locker held on rbd image.
// but *0* is unexpected here because first rbd_list_lockers already // but *0* is unexpected here because first rbd_list_lockers already
// dealt with no locker case // dealt with no locker case
if int(c_locker_cnt) <= 0 { if int(cLockerCount) <= 0 {
return "", nil, rbdError(c_locker_cnt) return "", nil, rbdError(cLockerCount)
} }
clients := cutil.SplitSparseBuffer(clients_buf) clients := cutil.SplitSparseBuffer(clientsBuf)
cookies := cutil.SplitSparseBuffer(cookies_buf) cookies := cutil.SplitSparseBuffer(cookiesBuf)
addrs := cutil.SplitSparseBuffer(addrs_buf) addrs := cutil.SplitSparseBuffer(addrsBuf)
lockers = make([]Locker, c_locker_cnt) lockers = make([]Locker, cLockerCount)
for i := 0; i < int(c_locker_cnt); i++ { for i := 0; i < int(cLockerCount); i++ {
lockers[i] = Locker{Client: clients[i], lockers[i] = Locker{Client: clients[i],
Cookie: cookies[i], Cookie: cookies[i],
Addr: addrs[i]} Addr: addrs[i]}
} }
return string(tag_buf), lockers, nil return string(tagBuf), lockers, nil
} }
// LockExclusive acquires an exclusive lock on the rbd image. // LockExclusive acquires an exclusive lock on the rbd image.
@ -643,10 +651,10 @@ func (image *Image) LockExclusive(cookie string) error {
return err return err
} }
c_cookie := C.CString(cookie) cCookie := C.CString(cookie)
defer C.free(unsafe.Pointer(c_cookie)) defer C.free(unsafe.Pointer(cCookie))
return getError(C.rbd_lock_exclusive(image.image, c_cookie)) return getError(C.rbd_lock_exclusive(image.image, cCookie))
} }
// LockShared acquires a shared lock on the rbd image. // LockShared acquires a shared lock on the rbd image.
@ -658,12 +666,12 @@ func (image *Image) LockShared(cookie string, tag string) error {
return err return err
} }
c_cookie := C.CString(cookie) cCookie := C.CString(cookie)
c_tag := C.CString(tag) cTag := C.CString(tag)
defer C.free(unsafe.Pointer(c_cookie)) defer C.free(unsafe.Pointer(cCookie))
defer C.free(unsafe.Pointer(c_tag)) defer C.free(unsafe.Pointer(cTag))
return getError(C.rbd_lock_shared(image.image, c_cookie, c_tag)) return getError(C.rbd_lock_shared(image.image, cCookie, cTag))
} }
// Unlock releases a lock on the image. // Unlock releases a lock on the image.
@ -675,10 +683,10 @@ func (image *Image) Unlock(cookie string) error {
return err return err
} }
c_cookie := C.CString(cookie) cCookie := C.CString(cookie)
defer C.free(unsafe.Pointer(c_cookie)) defer C.free(unsafe.Pointer(cCookie))
return getError(C.rbd_unlock(image.image, c_cookie)) return getError(C.rbd_unlock(image.image, cCookie))
} }
// BreakLock forces the release of a lock held by another client. // BreakLock forces the release of a lock held by another client.
@ -690,12 +698,12 @@ func (image *Image) BreakLock(client string, cookie string) error {
return err return err
} }
c_client := C.CString(client) cClient := C.CString(client)
c_cookie := C.CString(cookie) cCookie := C.CString(cookie)
defer C.free(unsafe.Pointer(c_client)) defer C.free(unsafe.Pointer(cClient))
defer C.free(unsafe.Pointer(c_cookie)) defer C.free(unsafe.Pointer(cCookie))
return getError(C.rbd_break_lock(image.image, c_client, c_cookie)) return getError(C.rbd_break_lock(image.image, cClient, cCookie))
} }
// ssize_t rbd_read(rbd_image_t image, uint64_t ofs, size_t len, char *buf); // ssize_t rbd_read(rbd_image_t image, uint64_t ofs, size_t len, char *buf);
@ -891,26 +899,26 @@ func (image *Image) GetSnapshotNames() (snaps []SnapInfo, err error) {
return nil, err return nil, err
} }
var c_max_snaps C.int var cMaxSnaps C.int
ret := C.rbd_snap_list(image.image, nil, &c_max_snaps) ret := C.rbd_snap_list(image.image, nil, &cMaxSnaps)
c_snaps := make([]C.rbd_snap_info_t, c_max_snaps) cSnaps := make([]C.rbd_snap_info_t, cMaxSnaps)
snaps = make([]SnapInfo, c_max_snaps) snaps = make([]SnapInfo, cMaxSnaps)
ret = C.rbd_snap_list(image.image, ret = C.rbd_snap_list(image.image,
&c_snaps[0], &c_max_snaps) &cSnaps[0], &cMaxSnaps)
if ret < 0 { if ret < 0 {
return nil, rbdError(ret) return nil, rbdError(ret)
} }
for i, s := range c_snaps { for i, s := range cSnaps {
snaps[i] = SnapInfo{Id: uint64(s.id), snaps[i] = SnapInfo{Id: uint64(s.id),
Size: uint64(s.size), Size: uint64(s.size),
Name: C.GoString(s.name)} Name: C.GoString(s.name)}
} }
C.rbd_snap_list_end(&c_snaps[0]) C.rbd_snap_list_end(&cSnaps[0])
return snaps[:len(snaps)-1], nil return snaps[:len(snaps)-1], nil
} }
@ -953,10 +961,10 @@ func (image *Image) SetSnapshot(snapname string) error {
return err return err
} }
c_snapname := C.CString(snapname) cSnapName := C.CString(snapname)
defer C.free(unsafe.Pointer(c_snapname)) defer C.free(unsafe.Pointer(cSnapName))
return getError(C.rbd_snap_set(image.image, c_snapname)) return getError(C.rbd_snap_set(image.image, cSnapName))
} }
// GetTrashList returns a slice of TrashInfo structs, containing information about all RBD images // GetTrashList returns a slice of TrashInfo structs, containing information about all RBD images
@ -994,21 +1002,21 @@ func GetTrashList(ioctx *rados.IOContext) ([]TrashInfo, error) {
// TrashRemove permanently deletes the trashed RBD with the specified id. // TrashRemove permanently deletes the trashed RBD with the specified id.
func TrashRemove(ioctx *rados.IOContext, id string, force bool) error { func TrashRemove(ioctx *rados.IOContext, id string, force bool) error {
c_id := C.CString(id) cid := C.CString(id)
defer C.free(unsafe.Pointer(c_id)) defer C.free(unsafe.Pointer(cid))
return getError(C.rbd_trash_remove(cephIoctx(ioctx), c_id, C.bool(force))) return getError(C.rbd_trash_remove(cephIoctx(ioctx), cid, C.bool(force)))
} }
// TrashRestore restores the trashed RBD with the specified id back to the pool from whence it // TrashRestore restores the trashed RBD with the specified id back to the pool from whence it
// came, with the specified new name. // came, with the specified new name.
func TrashRestore(ioctx *rados.IOContext, id, name string) error { func TrashRestore(ioctx *rados.IOContext, id, name string) error {
c_id := C.CString(id) cid := C.CString(id)
c_name := C.CString(name) cName := C.CString(name)
defer C.free(unsafe.Pointer(c_id)) defer C.free(unsafe.Pointer(cid))
defer C.free(unsafe.Pointer(c_name)) defer C.free(unsafe.Pointer(cName))
return getError(C.rbd_trash_restore(cephIoctx(ioctx), c_id, c_name)) return getError(C.rbd_trash_restore(cephIoctx(ioctx), cid, cName))
} }
// OpenImage will open an existing rbd image by name and snapshot name, // OpenImage will open an existing rbd image by name and snapshot name,
@ -1199,10 +1207,10 @@ func CreateImage(ioctx *rados.IOContext, name string, size uint64, rio *ImageOpt
return rbdError(C.EINVAL) return rbdError(C.EINVAL)
} }
c_name := C.CString(name) cName := C.CString(name)
defer C.free(unsafe.Pointer(c_name)) defer C.free(unsafe.Pointer(cName))
ret := C.rbd_create4(cephIoctx(ioctx), c_name, ret := C.rbd_create4(cephIoctx(ioctx), cName,
C.uint64_t(size), C.rbd_image_options_t(rio.options)) C.uint64_t(size), C.rbd_image_options_t(rio.options))
return getError(ret) return getError(ret)
} }
@ -1219,9 +1227,9 @@ func RemoveImage(ioctx *rados.IOContext, name string) error {
return ErrNoName return ErrNoName
} }
c_name := C.CString(name) cName := C.CString(name)
defer C.free(unsafe.Pointer(c_name)) defer C.free(unsafe.Pointer(cName))
return getError(C.rbd_remove(cephIoctx(ioctx), c_name)) return getError(C.rbd_remove(cephIoctx(ioctx), cName))
} }
// CloneImage creates a clone of the image from the named snapshot in the // CloneImage creates a clone of the image from the named snapshot in the

View File

@ -1,4 +1,6 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
// //
// Ceph Nautilus is the first release that includes rbd_list2() and // Ceph Nautilus is the first release that includes rbd_list2() and
// rbd_get_create_timestamp(). // rbd_get_create_timestamp().

View File

@ -27,10 +27,10 @@ func (image *Image) CreateSnapshot(snapname string) (*Snapshot, error) {
return nil, err return nil, err
} }
c_snapname := C.CString(snapname) cSnapName := C.CString(snapname)
defer C.free(unsafe.Pointer(c_snapname)) defer C.free(unsafe.Pointer(cSnapName))
ret := C.rbd_snap_create(image.image, c_snapname) ret := C.rbd_snap_create(image.image, cSnapName)
if ret < 0 { if ret < 0 {
return nil, rbdError(ret) return nil, rbdError(ret)
} }
@ -72,10 +72,10 @@ func (snapshot *Snapshot) Remove() error {
return err return err
} }
c_snapname := C.CString(snapshot.name) cSnapName := C.CString(snapshot.name)
defer C.free(unsafe.Pointer(c_snapname)) defer C.free(unsafe.Pointer(cSnapName))
return getError(C.rbd_snap_remove(snapshot.image.image, c_snapname)) return getError(C.rbd_snap_remove(snapshot.image.image, cSnapName))
} }
// Rollback the image to the snapshot. // Rollback the image to the snapshot.
@ -87,10 +87,10 @@ func (snapshot *Snapshot) Rollback() error {
return err return err
} }
c_snapname := C.CString(snapshot.name) cSnapName := C.CString(snapshot.name)
defer C.free(unsafe.Pointer(c_snapname)) defer C.free(unsafe.Pointer(cSnapName))
return getError(C.rbd_snap_rollback(snapshot.image.image, c_snapname)) return getError(C.rbd_snap_rollback(snapshot.image.image, cSnapName))
} }
// Protect a snapshot from unwanted deletion. // Protect a snapshot from unwanted deletion.
@ -102,10 +102,10 @@ func (snapshot *Snapshot) Protect() error {
return err return err
} }
c_snapname := C.CString(snapshot.name) cSnapName := C.CString(snapshot.name)
defer C.free(unsafe.Pointer(c_snapname)) defer C.free(unsafe.Pointer(cSnapName))
return getError(C.rbd_snap_protect(snapshot.image.image, c_snapname)) return getError(C.rbd_snap_protect(snapshot.image.image, cSnapName))
} }
// Unprotect stops protecting the snapshot. // Unprotect stops protecting the snapshot.
@ -117,10 +117,10 @@ func (snapshot *Snapshot) Unprotect() error {
return err return err
} }
c_snapname := C.CString(snapshot.name) cSnapName := C.CString(snapshot.name)
defer C.free(unsafe.Pointer(c_snapname)) defer C.free(unsafe.Pointer(cSnapName))
return getError(C.rbd_snap_unprotect(snapshot.image.image, c_snapname)) return getError(C.rbd_snap_unprotect(snapshot.image.image, cSnapName))
} }
// IsProtected returns true if the snapshot is currently protected. // IsProtected returns true if the snapshot is currently protected.
@ -133,23 +133,24 @@ func (snapshot *Snapshot) IsProtected() (bool, error) {
return false, err return false, err
} }
var c_is_protected C.int var cIsProtected C.int
c_snapname := C.CString(snapshot.name) cSnapName := C.CString(snapshot.name)
defer C.free(unsafe.Pointer(c_snapname)) defer C.free(unsafe.Pointer(cSnapName))
ret := C.rbd_snap_is_protected(snapshot.image.image, c_snapname, ret := C.rbd_snap_is_protected(snapshot.image.image, cSnapName,
&c_is_protected) &cIsProtected)
if ret < 0 { if ret < 0 {
return false, rbdError(ret) return false, rbdError(ret)
} }
return c_is_protected != 0, nil return cIsProtected != 0, nil
} }
// Set updates the rbd image (not the Snapshot) such that the snapshot // Set updates the rbd image (not the Snapshot) such that the snapshot is the
// is the source of readable data. // source of readable data.
// This method is deprecated. Refer the SetSnapshot method of the Image type instead. //
// Deprecated: use the SetSnapshot method of the Image type instead
// //
// Implements: // Implements:
// int rbd_snap_set(rbd_image_t image, const char *snapname); // int rbd_snap_set(rbd_image_t image, const char *snapname);

View File

@ -1,4 +1,6 @@
//go:build !luminous
// +build !luminous // +build !luminous
// //
// Ceph Mimic introduced rbd_snap_get_namespace_type(). // Ceph Mimic introduced rbd_snap_get_namespace_type().

View File

@ -1,4 +1,6 @@
//go:build !luminous && !mimic
// +build !luminous,!mimic // +build !luminous,!mimic
// //
// Ceph Nautilus introduced rbd_get_parent() and deprecated rbd_get_parent_info(). // Ceph Nautilus introduced rbd_get_parent() and deprecated rbd_get_parent_info().
// Ceph Nautilus introduced rbd_list_children3() and deprecated rbd_list_children(). // Ceph Nautilus introduced rbd_list_children3() and deprecated rbd_list_children().

View File

@ -1,3 +1,4 @@
//go:build !nautilus
// +build !nautilus // +build !nautilus
package rbd package rbd

2
vendor/modules.txt vendored
View File

@ -53,7 +53,7 @@ github.com/cenkalti/backoff/v3
## explicit ## explicit
github.com/ceph/ceph-csi/api/deploy/kubernetes/rbd github.com/ceph/ceph-csi/api/deploy/kubernetes/rbd
github.com/ceph/ceph-csi/api/deploy/ocp github.com/ceph/ceph-csi/api/deploy/ocp
# github.com/ceph/go-ceph v0.11.0 # github.com/ceph/go-ceph v0.12.0
## explicit ## explicit
github.com/ceph/go-ceph/cephfs/admin github.com/ceph/go-ceph/cephfs/admin
github.com/ceph/go-ceph/common/commands github.com/ceph/go-ceph/common/commands