mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-11-22 22:30:23 +00:00
rebase: update go-ceph to v0.7.0
updating go-ceph to latest 0.7.0 release. Signed-off-by: Madhu Rajanna <madhupr007@gmail.com>
This commit is contained in:
parent
97acd47ae9
commit
eeec1213cb
2
go.mod
2
go.mod
@ -3,7 +3,7 @@ module github.com/ceph/ceph-csi
|
|||||||
go 1.13
|
go 1.13
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/ceph/go-ceph v0.6.0
|
github.com/ceph/go-ceph v0.7.0
|
||||||
github.com/container-storage-interface/spec v1.3.0
|
github.com/container-storage-interface/spec v1.3.0
|
||||||
github.com/go-logr/logr v0.2.1 // indirect
|
github.com/go-logr/logr v0.2.1 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
|
||||||
|
4
go.sum
4
go.sum
@ -152,8 +152,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QH
|
|||||||
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 h1:gJzxrodnNd/CtPXjO3WYiakyNzHg3rtAi7rO74ejHYU=
|
github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f h1:gJzxrodnNd/CtPXjO3WYiakyNzHg3rtAi7rO74ejHYU=
|
||||||
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.6.0 h1:/sCL9a6nTIqTCgDAnNeK88Aw+i7rD4bpK+QpxgdDeP4=
|
github.com/ceph/go-ceph v0.7.0 h1:+4oWZCuvh9B7/kZVJVw/DSuk9Qby38KWY1pMQ5gYGyY=
|
||||||
github.com/ceph/go-ceph v0.6.0/go.mod h1:wd+keAOqrcsN//20VQnHBGtnBnY0KHl0PA024Ng8HfQ=
|
github.com/ceph/go-ceph v0.7.0/go.mod h1:wd+keAOqrcsN//20VQnHBGtnBnY0KHl0PA024Ng8HfQ=
|
||||||
github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY=
|
github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
|
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
60
vendor/github.com/ceph/go-ceph/cephfs/admin/flags.go
generated
vendored
Normal file
60
vendor/github.com/ceph/go-ceph/cephfs/admin/flags.go
generated
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
// +build !luminous,!mimic
|
||||||
|
|
||||||
|
package admin
|
||||||
|
|
||||||
|
// For APIs that accept extra sets of "boolean" flags we may end up wanting
|
||||||
|
// multiple different sets of supported flags. Example: most rm functions
|
||||||
|
// accept a force flag, but only subvolume delete has retain snapshots.
|
||||||
|
// To make this somewhat uniform in the admin package we define a utility
|
||||||
|
// interface and helper function to merge flags with naming options.
|
||||||
|
|
||||||
|
type flagSet interface {
|
||||||
|
flags() map[string]bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type commonRmFlags struct {
|
||||||
|
force bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f commonRmFlags) flags() map[string]bool {
|
||||||
|
o := make(map[string]bool)
|
||||||
|
if f.force {
|
||||||
|
o["force"] = true
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubVolRmFlags does not embed other types to simplify and keep the
|
||||||
|
// interface with the type flat and simple. At the cost of some code
|
||||||
|
// duplication we get a nicer UX for those using the library.
|
||||||
|
|
||||||
|
// SubVolRmFlags may be used to specify behavior modifying flags when
|
||||||
|
// removing sub volumes.
|
||||||
|
type SubVolRmFlags struct {
|
||||||
|
Force bool
|
||||||
|
RetainSnapshots bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f SubVolRmFlags) flags() map[string]bool {
|
||||||
|
o := make(map[string]bool)
|
||||||
|
if f.Force {
|
||||||
|
o["force"] = true
|
||||||
|
}
|
||||||
|
if f.RetainSnapshots {
|
||||||
|
o["retain-snapshots"] = true
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
// mergeFlags combines a set of key-value settings with any type implementing
|
||||||
|
// the flagSet interface.
|
||||||
|
func mergeFlags(m map[string]string, f flagSet) map[string]interface{} {
|
||||||
|
o := make(map[string]interface{})
|
||||||
|
for k, v := range m {
|
||||||
|
o[k] = v
|
||||||
|
}
|
||||||
|
for k, v := range f.flags() {
|
||||||
|
o[k] = v
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
}
|
15
vendor/github.com/ceph/go-ceph/cephfs/admin/fsadmin.go
generated
vendored
15
vendor/github.com/ceph/go-ceph/cephfs/admin/fsadmin.go
generated
vendored
@ -143,18 +143,3 @@ func modeString(m int, force bool) string {
|
|||||||
func uint64String(v uint64) string {
|
func uint64String(v uint64) string {
|
||||||
return strconv.FormatUint(uint64(v), 10)
|
return strconv.FormatUint(uint64(v), 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
type rmFlags struct {
|
|
||||||
force bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f rmFlags) Update(m map[string]string) map[string]interface{} {
|
|
||||||
o := make(map[string]interface{})
|
|
||||||
for k, v := range m {
|
|
||||||
o[k] = v
|
|
||||||
}
|
|
||||||
if f.force {
|
|
||||||
o["force"] = true
|
|
||||||
}
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
24
vendor/github.com/ceph/go-ceph/cephfs/admin/subvolume.go
generated
vendored
24
vendor/github.com/ceph/go-ceph/cephfs/admin/subvolume.go
generated
vendored
@ -87,7 +87,7 @@ func (fsa *FSAdmin) ListSubVolumes(volume, group string) ([]string, error) {
|
|||||||
// Similar To:
|
// Similar To:
|
||||||
// ceph fs subvolume rm <volume> --group-name=<group> <name>
|
// ceph fs subvolume rm <volume> --group-name=<group> <name>
|
||||||
func (fsa *FSAdmin) RemoveSubVolume(volume, group, name string) error {
|
func (fsa *FSAdmin) RemoveSubVolume(volume, group, name string) error {
|
||||||
return fsa.rmSubVolume(volume, group, name, rmFlags{})
|
return fsa.RemoveSubVolumeWithFlags(volume, group, name, SubVolRmFlags{})
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForceRemoveSubVolume will delete a CephFS subvolume in a volume and optional
|
// ForceRemoveSubVolume will delete a CephFS subvolume in a volume and optional
|
||||||
@ -96,10 +96,18 @@ func (fsa *FSAdmin) RemoveSubVolume(volume, group, name string) error {
|
|||||||
// Similar To:
|
// Similar To:
|
||||||
// ceph fs subvolume rm <volume> --group-name=<group> <name> --force
|
// ceph fs subvolume rm <volume> --group-name=<group> <name> --force
|
||||||
func (fsa *FSAdmin) ForceRemoveSubVolume(volume, group, name string) error {
|
func (fsa *FSAdmin) ForceRemoveSubVolume(volume, group, name string) error {
|
||||||
return fsa.rmSubVolume(volume, group, name, rmFlags{force: true})
|
return fsa.RemoveSubVolumeWithFlags(volume, group, name, SubVolRmFlags{Force: true})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fsa *FSAdmin) rmSubVolume(volume, group, name string, o rmFlags) error {
|
// RemoveSubVolumeWithFlags will delete a CephFS subvolume in a volume and
|
||||||
|
// optional subvolume group. This function accepts a SubVolRmFlags type that
|
||||||
|
// can be used to specify flags that modify the operations behavior.
|
||||||
|
// Equivalent to RemoveSubVolume with no flags set.
|
||||||
|
// Equivalent to ForceRemoveSubVolume if only the "Force" flag is set.
|
||||||
|
//
|
||||||
|
// Similar To:
|
||||||
|
// ceph fs subvolume rm <volume> --group-name=<group> <name> [...flags...]
|
||||||
|
func (fsa *FSAdmin) RemoveSubVolumeWithFlags(volume, group, name string, o SubVolRmFlags) error {
|
||||||
m := map[string]string{
|
m := map[string]string{
|
||||||
"prefix": "fs subvolume rm",
|
"prefix": "fs subvolume rm",
|
||||||
"vol_name": volume,
|
"vol_name": volume,
|
||||||
@ -109,7 +117,7 @@ func (fsa *FSAdmin) rmSubVolume(volume, group, name string, o rmFlags) error {
|
|||||||
if group != NoGroup {
|
if group != NoGroup {
|
||||||
m["group_name"] = group
|
m["group_name"] = group
|
||||||
}
|
}
|
||||||
return fsa.marshalMgrCommand(o.Update(m)).noData().End()
|
return fsa.marshalMgrCommand(mergeFlags(m, o)).noData().End()
|
||||||
}
|
}
|
||||||
|
|
||||||
type subVolumeResizeFields struct {
|
type subVolumeResizeFields struct {
|
||||||
@ -264,7 +272,7 @@ func (fsa *FSAdmin) CreateSubVolumeSnapshot(volume, group, source, name string)
|
|||||||
// Similar To:
|
// Similar To:
|
||||||
// ceph fs subvolume snapshot rm <volume> --group-name=<group> <subvolume> <name>
|
// ceph fs subvolume snapshot rm <volume> --group-name=<group> <subvolume> <name>
|
||||||
func (fsa *FSAdmin) RemoveSubVolumeSnapshot(volume, group, subvolume, name string) error {
|
func (fsa *FSAdmin) RemoveSubVolumeSnapshot(volume, group, subvolume, name string) error {
|
||||||
return fsa.rmSubVolumeSnapshot(volume, group, subvolume, name, rmFlags{})
|
return fsa.rmSubVolumeSnapshot(volume, group, subvolume, name, commonRmFlags{})
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForceRemoveSubVolumeSnapshot removes the specified snapshot from the subvolume.
|
// ForceRemoveSubVolumeSnapshot removes the specified snapshot from the subvolume.
|
||||||
@ -272,10 +280,10 @@ func (fsa *FSAdmin) RemoveSubVolumeSnapshot(volume, group, subvolume, name strin
|
|||||||
// Similar To:
|
// Similar To:
|
||||||
// ceph fs subvolume snapshot rm <volume> --group-name=<group> <subvolume> <name> --force
|
// ceph fs subvolume snapshot rm <volume> --group-name=<group> <subvolume> <name> --force
|
||||||
func (fsa *FSAdmin) ForceRemoveSubVolumeSnapshot(volume, group, subvolume, name string) error {
|
func (fsa *FSAdmin) ForceRemoveSubVolumeSnapshot(volume, group, subvolume, name string) error {
|
||||||
return fsa.rmSubVolumeSnapshot(volume, group, subvolume, name, rmFlags{force: true})
|
return fsa.rmSubVolumeSnapshot(volume, group, subvolume, name, commonRmFlags{force: true})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fsa *FSAdmin) rmSubVolumeSnapshot(volume, group, subvolume, name string, o rmFlags) error {
|
func (fsa *FSAdmin) rmSubVolumeSnapshot(volume, group, subvolume, name string, o commonRmFlags) error {
|
||||||
|
|
||||||
m := map[string]string{
|
m := map[string]string{
|
||||||
"prefix": "fs subvolume snapshot rm",
|
"prefix": "fs subvolume snapshot rm",
|
||||||
@ -287,7 +295,7 @@ func (fsa *FSAdmin) rmSubVolumeSnapshot(volume, group, subvolume, name string, o
|
|||||||
if group != NoGroup {
|
if group != NoGroup {
|
||||||
m["group_name"] = group
|
m["group_name"] = group
|
||||||
}
|
}
|
||||||
return fsa.marshalMgrCommand(o.Update(m)).noData().End()
|
return fsa.marshalMgrCommand(mergeFlags(m, o)).noData().End()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListSubVolumeSnapshots returns a listing of snapshots for a given subvolume.
|
// ListSubVolumeSnapshots returns a listing of snapshots for a given subvolume.
|
||||||
|
66
vendor/github.com/ceph/go-ceph/cephfs/admin/subvolumegroup.go
generated
vendored
66
vendor/github.com/ceph/go-ceph/cephfs/admin/subvolumegroup.go
generated
vendored
@ -69,23 +69,23 @@ func (fsa *FSAdmin) ListSubVolumeGroups(volume string) ([]string, error) {
|
|||||||
// Similar To:
|
// Similar To:
|
||||||
// ceph fs subvolumegroup rm <volume> <group_name>
|
// ceph fs subvolumegroup rm <volume> <group_name>
|
||||||
func (fsa *FSAdmin) RemoveSubVolumeGroup(volume, name string) error {
|
func (fsa *FSAdmin) RemoveSubVolumeGroup(volume, name string) error {
|
||||||
return fsa.rmSubVolumeGroup(volume, name, rmFlags{})
|
return fsa.rmSubVolumeGroup(volume, name, commonRmFlags{})
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForceRemoveSubVolumeGroup will delete a subvolume group in a volume.
|
// ForceRemoveSubVolumeGroup will delete a subvolume group in a volume.
|
||||||
// Similar To:
|
// Similar To:
|
||||||
// ceph fs subvolumegroup rm <volume> <group_name> --force
|
// ceph fs subvolumegroup rm <volume> <group_name> --force
|
||||||
func (fsa *FSAdmin) ForceRemoveSubVolumeGroup(volume, name string) error {
|
func (fsa *FSAdmin) ForceRemoveSubVolumeGroup(volume, name string) error {
|
||||||
return fsa.rmSubVolumeGroup(volume, name, rmFlags{force: true})
|
return fsa.rmSubVolumeGroup(volume, name, commonRmFlags{force: true})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fsa *FSAdmin) rmSubVolumeGroup(volume, name string, o rmFlags) error {
|
func (fsa *FSAdmin) rmSubVolumeGroup(volume, name string, o commonRmFlags) error {
|
||||||
res := fsa.marshalMgrCommand(o.Update(map[string]string{
|
res := fsa.marshalMgrCommand(mergeFlags(map[string]string{
|
||||||
"prefix": "fs subvolumegroup rm",
|
"prefix": "fs subvolumegroup rm",
|
||||||
"vol_name": volume,
|
"vol_name": volume,
|
||||||
"group_name": name,
|
"group_name": name,
|
||||||
"format": "json",
|
"format": "json",
|
||||||
}))
|
}, o))
|
||||||
return res.noData().End()
|
return res.noData().End()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,59 +103,3 @@ func (fsa *FSAdmin) SubVolumeGroupPath(volume, name string) (string, error) {
|
|||||||
}
|
}
|
||||||
return parsePathResponse(fsa.marshalMgrCommand(m))
|
return parsePathResponse(fsa.marshalMgrCommand(m))
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateSubVolumeGroupSnapshot creates a new snapshot from the source subvolume group.
|
|
||||||
//
|
|
||||||
// Similar To:
|
|
||||||
// ceph fs subvolumegroup snapshot create <volume> <group> <name>
|
|
||||||
func (fsa *FSAdmin) CreateSubVolumeGroupSnapshot(volume, group, name string) error {
|
|
||||||
m := map[string]string{
|
|
||||||
"prefix": "fs subvolumegroup snapshot create",
|
|
||||||
"vol_name": volume,
|
|
||||||
"group_name": group,
|
|
||||||
"snap_name": name,
|
|
||||||
"format": "json",
|
|
||||||
}
|
|
||||||
return fsa.marshalMgrCommand(m).noData().End()
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveSubVolumeGroupSnapshot removes the specified snapshot from the subvolume group.
|
|
||||||
//
|
|
||||||
// Similar To:
|
|
||||||
// ceph fs subvolumegroup snapshot rm <volume> <group> <name>
|
|
||||||
func (fsa *FSAdmin) RemoveSubVolumeGroupSnapshot(volume, group, name string) error {
|
|
||||||
return fsa.rmSubVolumeGroupSnapshot(volume, group, name, rmFlags{})
|
|
||||||
}
|
|
||||||
|
|
||||||
// ForceRemoveSubVolumeGroupSnapshot removes the specified snapshot from the subvolume group.
|
|
||||||
//
|
|
||||||
// Similar To:
|
|
||||||
// ceph fs subvolumegroup snapshot rm <volume> <group> <name> --force
|
|
||||||
func (fsa *FSAdmin) ForceRemoveSubVolumeGroupSnapshot(volume, group, name string) error {
|
|
||||||
return fsa.rmSubVolumeGroupSnapshot(volume, group, name, rmFlags{force: true})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fsa *FSAdmin) rmSubVolumeGroupSnapshot(volume, group, name string, o rmFlags) error {
|
|
||||||
m := map[string]string{
|
|
||||||
"prefix": "fs subvolumegroup snapshot rm",
|
|
||||||
"vol_name": volume,
|
|
||||||
"group_name": group,
|
|
||||||
"snap_name": name,
|
|
||||||
"format": "json",
|
|
||||||
}
|
|
||||||
return fsa.marshalMgrCommand(o.Update(m)).noData().End()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListSubVolumeGroupSnapshots returns a listing of snapshots for a given subvolume group.
|
|
||||||
//
|
|
||||||
// Similar To:
|
|
||||||
// ceph fs subvolumegroup snapshot ls <volume> <group>
|
|
||||||
func (fsa *FSAdmin) ListSubVolumeGroupSnapshots(volume, group string) ([]string, error) {
|
|
||||||
m := map[string]string{
|
|
||||||
"prefix": "fs subvolumegroup snapshot ls",
|
|
||||||
"vol_name": volume,
|
|
||||||
"group_name": group,
|
|
||||||
"format": "json",
|
|
||||||
}
|
|
||||||
return parseListNames(fsa.marshalMgrCommand(m))
|
|
||||||
}
|
|
||||||
|
47
vendor/github.com/ceph/go-ceph/internal/callbacks/callbacks.go
generated
vendored
47
vendor/github.com/ceph/go-ceph/internal/callbacks/callbacks.go
generated
vendored
@ -12,7 +12,7 @@ import (
|
|||||||
|
|
||||||
// Callbacks provides a tracker for data that is to be passed between Go
|
// Callbacks provides a tracker for data that is to be passed between Go
|
||||||
// and C callback functions. The Go callback/object may not be passed
|
// and C callback functions. The Go callback/object may not be passed
|
||||||
// by a pointer to C code and so instead integer indexes into an internal
|
// by a pointer to C code and so instead integer IDs into an internal
|
||||||
// map are used.
|
// map are used.
|
||||||
// Typically the item being added will either be a callback function or
|
// Typically the item being added will either be a callback function or
|
||||||
// a data structure containing a callback function. It is up to the caller
|
// a data structure containing a callback function. It is up to the caller
|
||||||
@ -20,6 +20,7 @@ import (
|
|||||||
type Callbacks struct {
|
type Callbacks struct {
|
||||||
mutex sync.RWMutex
|
mutex sync.RWMutex
|
||||||
cmap map[uintptr]interface{}
|
cmap map[uintptr]interface{}
|
||||||
|
lastID uintptr
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new callbacks tracker.
|
// New returns a new callbacks tracker.
|
||||||
@ -27,38 +28,38 @@ func New() *Callbacks {
|
|||||||
return &Callbacks{cmap: make(map[uintptr]interface{})}
|
return &Callbacks{cmap: make(map[uintptr]interface{})}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a callback/object to the tracker and return a new index
|
// getID returns a unique ID.
|
||||||
|
// NOTE: cb.mutex must be locked already!
|
||||||
|
func (cb *Callbacks) getID() uintptr {
|
||||||
|
for exists := true; exists; {
|
||||||
|
cb.lastID++
|
||||||
|
// Sanity check for the very unlikely case of an integer overflow in long
|
||||||
|
// running processes.
|
||||||
|
_, exists = cb.cmap[cb.lastID]
|
||||||
|
}
|
||||||
|
return cb.lastID
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a callback/object to the tracker and return a new ID
|
||||||
// for the object.
|
// for the object.
|
||||||
func (cb *Callbacks) Add(v interface{}) uintptr {
|
func (cb *Callbacks) Add(v interface{}) uintptr {
|
||||||
cb.mutex.Lock()
|
cb.mutex.Lock()
|
||||||
defer cb.mutex.Unlock()
|
defer cb.mutex.Unlock()
|
||||||
// this approach assumes that there are typically very few callbacks
|
id := cb.getID()
|
||||||
// in play at once and can just use the length of the map as our
|
cb.cmap[id] = v
|
||||||
// index. But in case of collisions we fall back to simply incrementing
|
return id
|
||||||
// until we find a free key like in the cgo wiki page.
|
|
||||||
// If this code ever becomes a hot path there's surely plenty of room
|
|
||||||
// for optimization in the future :-)
|
|
||||||
index := uintptr(len(cb.cmap) + 1)
|
|
||||||
for {
|
|
||||||
if _, found := cb.cmap[index]; !found {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
index++
|
|
||||||
}
|
|
||||||
cb.cmap[index] = v
|
|
||||||
return index
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove a callback/object given it's index.
|
// Remove a callback/object given it's ID.
|
||||||
func (cb *Callbacks) Remove(index uintptr) {
|
func (cb *Callbacks) Remove(id uintptr) {
|
||||||
cb.mutex.Lock()
|
cb.mutex.Lock()
|
||||||
defer cb.mutex.Unlock()
|
defer cb.mutex.Unlock()
|
||||||
delete(cb.cmap, index)
|
delete(cb.cmap, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lookup returns a mapped callback/object given an index.
|
// Lookup returns a mapped callback/object given an ID.
|
||||||
func (cb *Callbacks) Lookup(index uintptr) interface{} {
|
func (cb *Callbacks) Lookup(id uintptr) interface{} {
|
||||||
cb.mutex.RLock()
|
cb.mutex.RLock()
|
||||||
defer cb.mutex.RUnlock()
|
defer cb.mutex.RUnlock()
|
||||||
return cb.cmap[index]
|
return cb.cmap[id]
|
||||||
}
|
}
|
||||||
|
14
vendor/github.com/ceph/go-ceph/internal/cutil/cutil.go
generated
vendored
14
vendor/github.com/ceph/go-ceph/internal/cutil/cutil.go
generated
vendored
@ -1,14 +0,0 @@
|
|||||||
package cutil
|
|
||||||
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
// VoidPtr casts a uintptr value to an unsafe.Pointer value in order to use it
|
|
||||||
// directly as a void* argument in a C function call.
|
|
||||||
// CAUTION: NEVER store the result in a variable, or the Go GC could panic.
|
|
||||||
func VoidPtr(i uintptr) unsafe.Pointer {
|
|
||||||
var nullPtr unsafe.Pointer
|
|
||||||
// It's not possible to cast uintptr directly to unsafe.Pointer. Therefore we
|
|
||||||
// cast a null pointer to uintptr and apply pointer arithmetic on it, which
|
|
||||||
// allows us to cast it back to unsafe.Pointer.
|
|
||||||
return unsafe.Pointer(uintptr(nullPtr) + i)
|
|
||||||
}
|
|
4
vendor/github.com/ceph/go-ceph/rados/ioctx.go
generated
vendored
4
vendor/github.com/ceph/go-ceph/rados/ioctx.go
generated
vendored
@ -109,6 +109,10 @@ func (ioctx *IOContext) Pointer() unsafe.Pointer {
|
|||||||
|
|
||||||
// SetNamespace sets the namespace for objects within this IO context (pool).
|
// SetNamespace sets the namespace for objects within this IO context (pool).
|
||||||
// Setting namespace to a empty or zero length string sets the pool to the default namespace.
|
// Setting namespace to a empty or zero length string sets the pool to the default namespace.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// void rados_ioctx_set_namespace(rados_ioctx_t io,
|
||||||
|
// const char *nspace);
|
||||||
func (ioctx *IOContext) SetNamespace(namespace string) {
|
func (ioctx *IOContext) SetNamespace(namespace string) {
|
||||||
var c_ns *C.char
|
var c_ns *C.char
|
||||||
if len(namespace) > 0 {
|
if len(namespace) > 0 {
|
||||||
|
43
vendor/github.com/ceph/go-ceph/rados/ioctx_nautilus.go
generated
vendored
Normal file
43
vendor/github.com/ceph/go-ceph/rados/ioctx_nautilus.go
generated
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// +build !luminous,!mimic
|
||||||
|
|
||||||
|
package rados
|
||||||
|
|
||||||
|
// #cgo LDFLAGS: -lrados
|
||||||
|
// #include <rados/librados.h>
|
||||||
|
//
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/ceph/go-ceph/internal/retry"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetNamespace gets the namespace used for objects within this IO context.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// int rados_ioctx_get_namespace(rados_ioctx_t io, char *buf,
|
||||||
|
// unsigned maxlen);
|
||||||
|
func (ioctx *IOContext) GetNamespace() (string, error) {
|
||||||
|
if err := ioctx.validate(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
var (
|
||||||
|
err error
|
||||||
|
buf []byte
|
||||||
|
ret C.int
|
||||||
|
)
|
||||||
|
retry.WithSizes(128, 8192, func(size int) retry.Hint {
|
||||||
|
buf = make([]byte, size)
|
||||||
|
ret = C.rados_ioctx_get_namespace(
|
||||||
|
ioctx.ioctx,
|
||||||
|
(*C.char)(unsafe.Pointer(&buf[0])),
|
||||||
|
C.unsigned(len(buf)))
|
||||||
|
err = getErrorIfNegative(ret)
|
||||||
|
return retry.DoubleSize.If(err == errRange)
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(buf[:ret]), nil
|
||||||
|
}
|
27
vendor/github.com/ceph/go-ceph/rados/rados.go
generated
vendored
27
vendor/github.com/ceph/go-ceph/rados/rados.go
generated
vendored
@ -25,6 +25,33 @@ const (
|
|||||||
RadosAllNamespaces = AllNamespaces
|
RadosAllNamespaces = AllNamespaces
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// OpFlags are flags that can be set on a per-op basis.
|
||||||
|
type OpFlags uint
|
||||||
|
|
||||||
|
const (
|
||||||
|
// OpFlagNone can be use to not set any flags.
|
||||||
|
OpFlagNone = OpFlags(0)
|
||||||
|
// OpFlagExcl marks an op to fail a create operation if the object
|
||||||
|
// already exists.
|
||||||
|
OpFlagExcl = OpFlags(C.LIBRADOS_OP_FLAG_EXCL)
|
||||||
|
// OpFlagFailOk allows the transaction to succeed even if the flagged
|
||||||
|
// op fails.
|
||||||
|
OpFlagFailOk = OpFlags(C.LIBRADOS_OP_FLAG_FAILOK)
|
||||||
|
// OpFlagFAdviseRandom indicates read/write op random.
|
||||||
|
OpFlagFAdviseRandom = OpFlags(C.LIBRADOS_OP_FLAG_FADVISE_RANDOM)
|
||||||
|
// OpFlagFAdviseSequential indicates read/write op sequential.
|
||||||
|
OpFlagFAdviseSequential = OpFlags(C.LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL)
|
||||||
|
// OpFlagFAdviseWillNeed indicates read/write data will be accessed in
|
||||||
|
// the near future (by someone).
|
||||||
|
OpFlagFAdviseWillNeed = OpFlags(C.LIBRADOS_OP_FLAG_FADVISE_WILLNEED)
|
||||||
|
// OpFlagFAdviseDontNeed indicates read/write data will not accessed in
|
||||||
|
// the near future (by anyone).
|
||||||
|
OpFlagFAdviseDontNeed = OpFlags(C.LIBRADOS_OP_FLAG_FADVISE_DONTNEED)
|
||||||
|
// OpFlagFAdviseNoCache indicates read/write data will not accessed
|
||||||
|
// again (by *this* client).
|
||||||
|
OpFlagFAdviseNoCache = OpFlags(C.LIBRADOS_OP_FLAG_FADVISE_NOCACHE)
|
||||||
|
)
|
||||||
|
|
||||||
// Version returns the major, minor, and patch components of the version of
|
// Version returns the major, minor, and patch components of the version of
|
||||||
// the RADOS library linked against.
|
// the RADOS library linked against.
|
||||||
func Version() (int, int, int) {
|
func Version() (int, int, int) {
|
||||||
|
12
vendor/github.com/ceph/go-ceph/rados/rados_nautilus.go
generated
vendored
Normal file
12
vendor/github.com/ceph/go-ceph/rados/rados_nautilus.go
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// +build !mimic
|
||||||
|
|
||||||
|
package rados
|
||||||
|
|
||||||
|
// #include <rados/librados.h>
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
const (
|
||||||
|
// OpFlagFAdviseFUA optionally support FUA (force unit access) on write
|
||||||
|
// requests.
|
||||||
|
OpFlagFAdviseFUA = OpFlags(C.LIBRADOS_OP_FLAG_FADVISE_FUA)
|
||||||
|
)
|
21
vendor/github.com/ceph/go-ceph/rbd/diff_iterate.go
generated
vendored
21
vendor/github.com/ceph/go-ceph/rbd/diff_iterate.go
generated
vendored
@ -7,8 +7,15 @@ package rbd
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <rbd/librbd.h>
|
#include <rbd/librbd.h>
|
||||||
|
|
||||||
typedef int (*diff_iterate_callback_t)(uint64_t, size_t, int, void *);
|
extern int diffIterateCallback(uint64_t, size_t, int, uintptr_t);
|
||||||
extern int diffIterateCallback(uint64_t, size_t, int, void *);
|
|
||||||
|
// inline wrapper to cast uintptr_t to void*
|
||||||
|
static inline int wrap_rbd_diff_iterate2(rbd_image_t image,
|
||||||
|
const char *fromsnapname, uint64_t ofs, uint64_t len, uint8_t include_parent,
|
||||||
|
uint8_t whole_object, uintptr_t arg) {
|
||||||
|
return rbd_diff_iterate2(image, fromsnapname, ofs, len, include_parent,
|
||||||
|
whole_object, (void*)diffIterateCallback, (void*)arg);
|
||||||
|
};
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
@ -16,7 +23,6 @@ import (
|
|||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/ceph/go-ceph/internal/callbacks"
|
"github.com/ceph/go-ceph/internal/callbacks"
|
||||||
"github.com/ceph/go-ceph/internal/cutil"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var diffIterateCallbacks = callbacks.New()
|
var diffIterateCallbacks = callbacks.New()
|
||||||
@ -101,24 +107,23 @@ func (image *Image) DiffIterate(config DiffIterateConfig) error {
|
|||||||
cbIndex := diffIterateCallbacks.Add(config)
|
cbIndex := diffIterateCallbacks.Add(config)
|
||||||
defer diffIterateCallbacks.Remove(cbIndex)
|
defer diffIterateCallbacks.Remove(cbIndex)
|
||||||
|
|
||||||
ret := C.rbd_diff_iterate2(
|
ret := C.wrap_rbd_diff_iterate2(
|
||||||
image.image,
|
image.image,
|
||||||
cSnapName,
|
cSnapName,
|
||||||
C.uint64_t(config.Offset),
|
C.uint64_t(config.Offset),
|
||||||
C.uint64_t(config.Length),
|
C.uint64_t(config.Length),
|
||||||
C.uint8_t(config.IncludeParent),
|
C.uint8_t(config.IncludeParent),
|
||||||
C.uint8_t(config.WholeObject),
|
C.uint8_t(config.WholeObject),
|
||||||
C.diff_iterate_callback_t(C.diffIterateCallback),
|
C.uintptr_t(cbIndex))
|
||||||
cutil.VoidPtr(cbIndex))
|
|
||||||
|
|
||||||
return getError(ret)
|
return getError(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export diffIterateCallback
|
//export diffIterateCallback
|
||||||
func diffIterateCallback(
|
func diffIterateCallback(
|
||||||
offset C.uint64_t, length C.size_t, exists C.int, index unsafe.Pointer) C.int {
|
offset C.uint64_t, length C.size_t, exists C.int, index uintptr) C.int {
|
||||||
|
|
||||||
v := diffIterateCallbacks.Lookup(uintptr(index))
|
v := diffIterateCallbacks.Lookup(index)
|
||||||
config := v.(DiffIterateConfig)
|
config := v.(DiffIterateConfig)
|
||||||
return C.int(config.Callback(
|
return C.int(config.Callback(
|
||||||
uint64(offset), uint64(length), int(exists), config.Data))
|
uint64(offset), uint64(length), int(exists), config.Data))
|
||||||
|
149
vendor/github.com/ceph/go-ceph/rbd/metadata.go
generated
vendored
Normal file
149
vendor/github.com/ceph/go-ceph/rbd/metadata.go
generated
vendored
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
package rbd
|
||||||
|
|
||||||
|
// #cgo LDFLAGS: -lrbd
|
||||||
|
// #include <stdlib.h>
|
||||||
|
// #include <rbd/librbd.h>
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/ceph/go-ceph/internal/cutil"
|
||||||
|
"github.com/ceph/go-ceph/internal/retry"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetMetadata returns the metadata string associated with the given key.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// int rbd_metadata_get(rbd_image_t image, const char *key, char *value, size_t *vallen)
|
||||||
|
func (image *Image) GetMetadata(key string) (string, error) {
|
||||||
|
if err := image.validate(imageIsOpen); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
c_key := C.CString(key)
|
||||||
|
defer C.free(unsafe.Pointer(c_key))
|
||||||
|
|
||||||
|
var (
|
||||||
|
buf []byte
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
retry.WithSizes(4096, 262144, func(size int) retry.Hint {
|
||||||
|
csize := C.size_t(size)
|
||||||
|
buf = make([]byte, csize)
|
||||||
|
// rbd_metadata_get is a bit quirky and *does not* update the size
|
||||||
|
// value if the size passed in >= the needed size.
|
||||||
|
ret := C.rbd_metadata_get(
|
||||||
|
image.image, c_key, (*C.char)(unsafe.Pointer(&buf[0])), &csize)
|
||||||
|
err = getError(ret)
|
||||||
|
return retry.Size(int(csize)).If(err == errRange)
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return C.GoString((*C.char)(unsafe.Pointer(&buf[0]))), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMetadata updates the metadata string associated with the given key.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// int rbd_metadata_set(rbd_image_t image, const char *key, const char *value)
|
||||||
|
func (image *Image) SetMetadata(key string, value string) error {
|
||||||
|
if err := image.validate(imageIsOpen); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c_key := C.CString(key)
|
||||||
|
c_value := C.CString(value)
|
||||||
|
defer C.free(unsafe.Pointer(c_key))
|
||||||
|
defer C.free(unsafe.Pointer(c_value))
|
||||||
|
|
||||||
|
ret := C.rbd_metadata_set(image.image, c_key, c_value)
|
||||||
|
if ret < 0 {
|
||||||
|
return rbdError(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveMetadata clears the metadata associated with the given key.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// int rbd_metadata_remove(rbd_image_t image, const char *key)
|
||||||
|
func (image *Image) RemoveMetadata(key string) error {
|
||||||
|
if err := image.validate(imageIsOpen); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c_key := C.CString(key)
|
||||||
|
defer C.free(unsafe.Pointer(c_key))
|
||||||
|
|
||||||
|
ret := C.rbd_metadata_remove(image.image, c_key)
|
||||||
|
if ret < 0 {
|
||||||
|
return rbdError(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListMetadata returns a map containing all metadata assigned to the RBD image.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// int rbd_metadata_list(rbd_image_t image, const char *start, uint64_t max,
|
||||||
|
// char *keys, size_t *key_len, char *values, size_t *vals_len);
|
||||||
|
func (image *Image) ListMetadata() (map[string]string, error) {
|
||||||
|
if err := image.validate(imageIsOpen); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
err error
|
||||||
|
keysbuf []byte
|
||||||
|
keysSize C.size_t
|
||||||
|
valsbuf []byte
|
||||||
|
valsSize C.size_t
|
||||||
|
)
|
||||||
|
retry.WithSizes(4096, 262144, func(size int) retry.Hint {
|
||||||
|
keysbuf = make([]byte, size)
|
||||||
|
keysSize = C.size_t(size)
|
||||||
|
valsbuf = make([]byte, size)
|
||||||
|
valsSize = C.size_t(size)
|
||||||
|
// the rbd_metadata_list function can use a start point and a limit.
|
||||||
|
// we do not use it and prefer our retry helper and just allocating
|
||||||
|
// buffers large enough to take all the keys and values
|
||||||
|
ret := C.rbd_metadata_list(
|
||||||
|
image.image,
|
||||||
|
(*C.char)(unsafe.Pointer(&empty[0])), // always start at the beginning (no paging)
|
||||||
|
0, // fetch all key-value pairs
|
||||||
|
(*C.char)(unsafe.Pointer(&keysbuf[0])),
|
||||||
|
&keysSize,
|
||||||
|
(*C.char)(unsafe.Pointer(&valsbuf[0])),
|
||||||
|
&valsSize)
|
||||||
|
|
||||||
|
err = getError(ret)
|
||||||
|
nextSize := valsSize
|
||||||
|
if keysSize > nextSize {
|
||||||
|
nextSize = keysSize
|
||||||
|
}
|
||||||
|
return retry.Size(int(nextSize)).If(err == errRange)
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
m := map[string]string{}
|
||||||
|
keys := cutil.SplitBuffer(keysbuf[:keysSize])
|
||||||
|
vals := cutil.SplitBuffer(valsbuf[:valsSize])
|
||||||
|
if len(keys) != len(vals) {
|
||||||
|
// this should not happen (famous last words)
|
||||||
|
return nil, errRange
|
||||||
|
}
|
||||||
|
for i := range keys {
|
||||||
|
m[keys[i]] = vals[i]
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// rather than allocate memory every time that ListMetadata is called,
|
||||||
|
// define a static byte slice to stand in for the C "empty string"
|
||||||
|
var empty = []byte{0}
|
104
vendor/github.com/ceph/go-ceph/rbd/rbd.go
generated
vendored
104
vendor/github.com/ceph/go-ceph/rbd/rbd.go
generated
vendored
@ -808,6 +808,36 @@ func (image *Image) WriteAt(data []byte, off int64) (n int, err error) {
|
|||||||
return ret, err
|
return ret, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteSame repeats writing data from starting point ofs until n bytes have
|
||||||
|
// been written.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// ssize_t rbd_writesame(rbd_image_t image, uint64_t ofs, size_t len,
|
||||||
|
// const char *buf, size_t data_len, int op_flags);
|
||||||
|
func (image *Image) WriteSame(ofs, n uint64, data []byte, flags rados.OpFlags) (int64, error) {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if err = image.validate(imageIsOpen); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(data) == 0 {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := C.rbd_writesame(image.image,
|
||||||
|
C.uint64_t(ofs),
|
||||||
|
C.uint64_t(n),
|
||||||
|
(*C.char)(unsafe.Pointer(&data[0])),
|
||||||
|
C.size_t(len(data)),
|
||||||
|
C.int(flags))
|
||||||
|
if ret < 0 {
|
||||||
|
err = getError(C.int(ret))
|
||||||
|
}
|
||||||
|
|
||||||
|
return int64(ret), err
|
||||||
|
}
|
||||||
|
|
||||||
// Flush all cached writes to storage.
|
// Flush all cached writes to storage.
|
||||||
//
|
//
|
||||||
// Implements:
|
// Implements:
|
||||||
@ -853,80 +883,6 @@ func (image *Image) GetSnapshotNames() (snaps []SnapInfo, err error) {
|
|||||||
return snaps[:len(snaps)-1], nil
|
return snaps[:len(snaps)-1], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMetadata returns the metadata string associated with the given key.
|
|
||||||
//
|
|
||||||
// Implements:
|
|
||||||
// int rbd_metadata_get(rbd_image_t image, const char *key, char *value, size_t *vallen)
|
|
||||||
func (image *Image) GetMetadata(key string) (string, error) {
|
|
||||||
if err := image.validate(imageIsOpen); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
c_key := C.CString(key)
|
|
||||||
defer C.free(unsafe.Pointer(c_key))
|
|
||||||
|
|
||||||
var (
|
|
||||||
buf []byte
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
retry.WithSizes(4096, 262144, func(size int) retry.Hint {
|
|
||||||
csize := C.size_t(size)
|
|
||||||
buf = make([]byte, csize)
|
|
||||||
// rbd_metadata_get is a bit quirky and *does not* update the size
|
|
||||||
// value if the size passed in >= the needed size.
|
|
||||||
ret := C.rbd_metadata_get(
|
|
||||||
image.image, c_key, (*C.char)(unsafe.Pointer(&buf[0])), &csize)
|
|
||||||
err = getError(ret)
|
|
||||||
return retry.Size(int(csize)).If(err == errRange)
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return C.GoString((*C.char)(unsafe.Pointer(&buf[0]))), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetadata updates the metadata string associated with the given key.
|
|
||||||
//
|
|
||||||
// Implements:
|
|
||||||
// int rbd_metadata_set(rbd_image_t image, const char *key, const char *value)
|
|
||||||
func (image *Image) SetMetadata(key string, value string) error {
|
|
||||||
if err := image.validate(imageIsOpen); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
c_key := C.CString(key)
|
|
||||||
c_value := C.CString(value)
|
|
||||||
defer C.free(unsafe.Pointer(c_key))
|
|
||||||
defer C.free(unsafe.Pointer(c_value))
|
|
||||||
|
|
||||||
ret := C.rbd_metadata_set(image.image, c_key, c_value)
|
|
||||||
if ret < 0 {
|
|
||||||
return rbdError(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveMetadata clears the metadata associated with the given key.
|
|
||||||
//
|
|
||||||
// Implements:
|
|
||||||
// int rbd_metadata_remove(rbd_image_t image, const char *key)
|
|
||||||
func (image *Image) RemoveMetadata(key string) error {
|
|
||||||
if err := image.validate(imageIsOpen); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
c_key := C.CString(key)
|
|
||||||
defer C.free(unsafe.Pointer(c_key))
|
|
||||||
|
|
||||||
ret := C.rbd_metadata_remove(image.image, c_key)
|
|
||||||
if ret < 0 {
|
|
||||||
return rbdError(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetId returns the internal image ID string.
|
// GetId returns the internal image ID string.
|
||||||
//
|
//
|
||||||
// Implements:
|
// Implements:
|
||||||
|
21
vendor/github.com/ceph/go-ceph/rbd/watchers_mimic.go
generated
vendored
21
vendor/github.com/ceph/go-ceph/rbd/watchers_mimic.go
generated
vendored
@ -8,15 +8,19 @@ package rbd
|
|||||||
#cgo LDFLAGS: -lrbd
|
#cgo LDFLAGS: -lrbd
|
||||||
#include <rbd/librbd.h>
|
#include <rbd/librbd.h>
|
||||||
|
|
||||||
extern void imageWatchCallback(void *);
|
extern void imageWatchCallback(uintptr_t);
|
||||||
|
|
||||||
|
// inline wrapper to cast uintptr_t to void*
|
||||||
|
static inline int wrap_rbd_update_watch(rbd_image_t image, uint64_t *handle,
|
||||||
|
uintptr_t arg) {
|
||||||
|
return rbd_update_watch(image, handle, (void*)imageWatchCallback, (void*)arg);
|
||||||
|
};
|
||||||
|
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"github.com/ceph/go-ceph/internal/callbacks"
|
"github.com/ceph/go-ceph/internal/callbacks"
|
||||||
"github.com/ceph/go-ceph/internal/cutil"
|
|
||||||
"github.com/ceph/go-ceph/internal/retry"
|
"github.com/ceph/go-ceph/internal/retry"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -107,11 +111,10 @@ func (image *Image) UpdateWatch(cb WatchCallback, data interface{}) (*Watch, err
|
|||||||
cbIndex: watchCallbacks.Add(wcc),
|
cbIndex: watchCallbacks.Add(wcc),
|
||||||
}
|
}
|
||||||
|
|
||||||
ret := C.rbd_update_watch(
|
ret := C.wrap_rbd_update_watch(
|
||||||
image.image,
|
image.image,
|
||||||
&w.handle,
|
&w.handle,
|
||||||
C.rbd_update_callback_t(C.imageWatchCallback),
|
C.uintptr_t(w.cbIndex))
|
||||||
cutil.VoidPtr(w.cbIndex))
|
|
||||||
if ret != 0 {
|
if ret != 0 {
|
||||||
return nil, getError(ret)
|
return nil, getError(ret)
|
||||||
}
|
}
|
||||||
@ -135,8 +138,8 @@ func (w *Watch) Unwatch() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//export imageWatchCallback
|
//export imageWatchCallback
|
||||||
func imageWatchCallback(index unsafe.Pointer) {
|
func imageWatchCallback(index uintptr) {
|
||||||
v := watchCallbacks.Lookup(uintptr(index))
|
v := watchCallbacks.Lookup(index)
|
||||||
wcc := v.(watchCallbackCtx)
|
wcc := v.(watchCallbackCtx)
|
||||||
wcc.callback(wcc.data)
|
wcc.callback(wcc.data)
|
||||||
}
|
}
|
||||||
|
2
vendor/modules.txt
vendored
2
vendor/modules.txt
vendored
@ -2,7 +2,7 @@
|
|||||||
github.com/beorn7/perks/quantile
|
github.com/beorn7/perks/quantile
|
||||||
# github.com/blang/semver v3.5.0+incompatible
|
# github.com/blang/semver v3.5.0+incompatible
|
||||||
github.com/blang/semver
|
github.com/blang/semver
|
||||||
# github.com/ceph/go-ceph v0.6.0
|
# github.com/ceph/go-ceph v0.7.0
|
||||||
github.com/ceph/go-ceph/cephfs/admin
|
github.com/ceph/go-ceph/cephfs/admin
|
||||||
github.com/ceph/go-ceph/internal/callbacks
|
github.com/ceph/go-ceph/internal/callbacks
|
||||||
github.com/ceph/go-ceph/internal/cutil
|
github.com/ceph/go-ceph/internal/cutil
|
||||||
|
Loading…
Reference in New Issue
Block a user