mirror of https://github.com/ceph/go-ceph
rbd: add constants for pool stat options and wrapper for rbd_pool_stats_get()
Added pool stat options constants. Also implemented GetAllPoolStats() function to introduce the functionality of rbd_pool_stats_option_add_uint64() and rbd_pool_stats_get() Signed-off-by: Mudit Agarwal <muagarwa@redhat.com>
This commit is contained in:
parent
fec47ac9a9
commit
2bb1b9bffc
|
@ -126,3 +126,92 @@ func (poolstats *poolStats) destroy() {
|
||||||
poolstats.stats = nil
|
poolstats.stats = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PoolStatOption represents a group of configurable pool stat options.
|
||||||
|
type PoolStatOption C.rbd_pool_stat_option_t
|
||||||
|
|
||||||
|
const (
|
||||||
|
// PoolStatOptionImages is the representation of
|
||||||
|
// RBD_POOL_STAT_OPTION_IMAGES from librbd.
|
||||||
|
PoolStatOptionImages = PoolStatOption(C.RBD_POOL_STAT_OPTION_IMAGES)
|
||||||
|
// PoolStatOptionImageProvisionedBytes is the representation of
|
||||||
|
// RBD_POOL_STAT_OPTION_IMAGE_PROVISIONED_BYTES from librbd.
|
||||||
|
PoolStatOptionImageProvisionedBytes = PoolStatOption(C.RBD_POOL_STAT_OPTION_IMAGE_PROVISIONED_BYTES)
|
||||||
|
// PoolStatOptionImageMaxProvisionedBytes is the representation of
|
||||||
|
// RBD_POOL_STAT_OPTION_IMAGE_MAX_PROVISIONED_BYTES from librbd.
|
||||||
|
PoolStatOptionImageMaxProvisionedBytes = PoolStatOption(C.RBD_POOL_STAT_OPTION_IMAGE_MAX_PROVISIONED_BYTES)
|
||||||
|
// PoolStatOptionImageSnapshots is the representation of
|
||||||
|
// RBD_POOL_STAT_OPTION_IMAGE_SNAPSHOTS from librbd.
|
||||||
|
PoolStatOptionImageSnapshots = PoolStatOption(C.RBD_POOL_STAT_OPTION_IMAGE_SNAPSHOTS)
|
||||||
|
// PoolStatOptionTrashImages is the representation of
|
||||||
|
// RBD_POOL_STAT_OPTION_TRASH_IMAGES from librbd.
|
||||||
|
PoolStatOptionTrashImages = PoolStatOption(C.RBD_POOL_STAT_OPTION_TRASH_IMAGES)
|
||||||
|
// PoolStatOptionTrashProvisionedBytes is the representation of
|
||||||
|
// RBD_POOL_STAT_OPTION_TRASH_PROVISIONED_BYTES from librbd.
|
||||||
|
PoolStatOptionTrashProvisionedBytes = PoolStatOption(C.RBD_POOL_STAT_OPTION_TRASH_PROVISIONED_BYTES)
|
||||||
|
// PoolStatOptionTrashMaxProvisionedBytes is the representation of
|
||||||
|
// RBD_POOL_STAT_OPTION_TRASH_MAX_PROVISIONED_BYTES from librbd.
|
||||||
|
PoolStatOptionTrashMaxProvisionedBytes = PoolStatOption(C.RBD_POOL_STAT_OPTION_TRASH_MAX_PROVISIONED_BYTES)
|
||||||
|
// PoolStatOptionTrashSnapshots is the representation of
|
||||||
|
// RBD_POOL_STAT_OPTION_TRASH_SNAPSHOTS from librbd.
|
||||||
|
PoolStatOptionTrashSnapshots = PoolStatOption(C.RBD_POOL_STAT_OPTION_TRASH_SNAPSHOTS)
|
||||||
|
)
|
||||||
|
|
||||||
|
// addPoolStatOption adds the given PoolStatOption to PoolStats.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// int rbd_pool_stats_option_add_uint64(rbd_pool_stats_t stats, int stat_option, uint64_t* stat_val)
|
||||||
|
func (poolstats *poolStats) addPoolStatOption(option PoolStatOption, val *uint64) error {
|
||||||
|
ret := C.rbd_pool_stats_option_add_uint64(
|
||||||
|
poolstats.stats,
|
||||||
|
C.int(option),
|
||||||
|
(*C.uint64_t)(val))
|
||||||
|
return getError(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllPoolStats returns a map of all PoolStatOption(s) to their respective values.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// int rbd_pool_stats_get(rados_ioctx_t io, rbd_pool_stats_t stats);
|
||||||
|
func GetAllPoolStats(ioctx *rados.IOContext) (map[PoolStatOption]uint64, error) {
|
||||||
|
var omap = make(map[PoolStatOption]uint64)
|
||||||
|
if ioctx == nil {
|
||||||
|
return omap, ErrNoIOContext
|
||||||
|
}
|
||||||
|
|
||||||
|
poolstats := poolStatsCreate()
|
||||||
|
defer func() {
|
||||||
|
poolstats.destroy()
|
||||||
|
}()
|
||||||
|
|
||||||
|
var keys [8]PoolStatOption
|
||||||
|
|
||||||
|
keys[0] = PoolStatOptionImages
|
||||||
|
keys[1] = PoolStatOptionImageProvisionedBytes
|
||||||
|
keys[2] = PoolStatOptionImageMaxProvisionedBytes
|
||||||
|
keys[3] = PoolStatOptionImageSnapshots
|
||||||
|
keys[4] = PoolStatOptionTrashImages
|
||||||
|
keys[5] = PoolStatOptionTrashProvisionedBytes
|
||||||
|
keys[6] = PoolStatOptionTrashMaxProvisionedBytes
|
||||||
|
keys[7] = PoolStatOptionTrashSnapshots
|
||||||
|
|
||||||
|
ovalArray := make([]uint64, len(keys))
|
||||||
|
|
||||||
|
// add option with the address where the respective value would be stored.
|
||||||
|
for i, key := range keys {
|
||||||
|
err := poolstats.addPoolStatOption(key, &ovalArray[i])
|
||||||
|
if err != nil {
|
||||||
|
return omap, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := C.rbd_pool_stats_get(cephIoctx(ioctx), poolstats.stats)
|
||||||
|
if ret < 0 {
|
||||||
|
return omap, getError(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
for j, key := range keys {
|
||||||
|
omap[key] = ovalArray[j]
|
||||||
|
}
|
||||||
|
return omap, nil
|
||||||
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ package rbd
|
||||||
import (
|
import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
@ -131,3 +132,80 @@ func TestPoolInit(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetAllPoolStat(t *testing.T) {
|
||||||
|
conn := radosConnect(t)
|
||||||
|
poolName := GetUUID()
|
||||||
|
err := conn.MakePool(poolName)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
ioctx, err := conn.OpenIOContext(poolName)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.NotNil(t, ioctx)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
ioctx.Destroy()
|
||||||
|
conn.DeletePool(poolName)
|
||||||
|
conn.Shutdown()
|
||||||
|
}()
|
||||||
|
|
||||||
|
poolstats := poolStatsCreate()
|
||||||
|
defer func() {
|
||||||
|
poolstats.destroy()
|
||||||
|
}()
|
||||||
|
|
||||||
|
var imageName string
|
||||||
|
size := uint64(2 << 20)
|
||||||
|
var expectedSize uint64
|
||||||
|
|
||||||
|
for idx := 0; idx < 3; idx++ {
|
||||||
|
imageName = GetUUID()
|
||||||
|
image, err := Create(ioctx, imageName, size, testImageOrder)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
defer func() {
|
||||||
|
assert.NoError(t, image.Remove())
|
||||||
|
}()
|
||||||
|
expectedSize += size
|
||||||
|
}
|
||||||
|
|
||||||
|
imageName = GetUUID()
|
||||||
|
_, err = Create(ioctx, imageName, size, testImageOrder)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
expectedSize += size
|
||||||
|
img, err := OpenImage(ioctx, imageName, NoSnapshot)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
mySnap, err := img.CreateSnapshot("mySnap")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
t.Run("NullIOContext", func(t *testing.T) {
|
||||||
|
_, err = GetAllPoolStats(nil)
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("CheckPoolStatOption", func(t *testing.T) {
|
||||||
|
err := img.Resize(size)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.NoError(t, mySnap.Remove())
|
||||||
|
assert.NoError(t, img.Close())
|
||||||
|
err = img.Trash(time.Hour)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
defer func() {
|
||||||
|
trashList, err := GetTrashList(ioctx)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.NoError(t, TrashRemove(ioctx, trashList[0].Id, true))
|
||||||
|
}()
|
||||||
|
|
||||||
|
omap, err := GetAllPoolStats(ioctx)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, uint64(3), omap[PoolStatOptionImages])
|
||||||
|
assert.Equal(t, (expectedSize - size), omap[PoolStatOptionImageProvisionedBytes])
|
||||||
|
assert.Equal(t, expectedSize-size, omap[PoolStatOptionImageMaxProvisionedBytes])
|
||||||
|
assert.Equal(t, uint64(0), omap[PoolStatOptionImageSnapshots])
|
||||||
|
assert.Equal(t, uint64(0), omap[PoolStatOptionTrashSnapshots])
|
||||||
|
assert.Equal(t, uint64(1), omap[PoolStatOptionTrashImages])
|
||||||
|
assert.Equal(t, size, omap[PoolStatOptionTrashProvisionedBytes])
|
||||||
|
assert.Equal(t, size, omap[PoolStatOptionTrashMaxProvisionedBytes])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue