mirror of https://github.com/ceph/go-ceph
rados: add GetLastVersion implementing rados_get_last_version
The GetLastVersion returns a number representing the most recent read/write version for the io context. Signed-off-by: John Mulligan <jmulligan@redhat.com>
This commit is contained in:
parent
9179f8df29
commit
edcee808b1
|
@ -646,3 +646,16 @@ func (ioctx *IOContext) BreakLock(oid, name, client, cookie string) (int, error)
|
||||||
return int(ret), getError(ret)
|
return int(ret), getError(ret)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetLastVersion will return the version number of the last object read or
|
||||||
|
// written to.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// uint64_t rados_get_last_version(rados_ioctx_t io);
|
||||||
|
func (ioctx *IOContext) GetLastVersion() (uint64, error) {
|
||||||
|
if err := ioctx.validate(); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
v := C.rados_get_last_version(ioctx.ioctx)
|
||||||
|
return uint64(v), nil
|
||||||
|
}
|
||||||
|
|
|
@ -1158,6 +1158,116 @@ func (suite *RadosTestSuite) TestOpenIOContextInvalidPool() {
|
||||||
require.Nil(suite.T(), ioctx)
|
require.Nil(suite.T(), ioctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *RadosTestSuite) TestGetLastVersion() {
|
||||||
|
suite.SetupConnection()
|
||||||
|
// NOTE: Reusing the ioctx set up by SetupConnection seems to make this
|
||||||
|
// test flakey. This is possibly be due to the value being "global" to the
|
||||||
|
// ioctx. Thus we create a new ioctx for the subtests.
|
||||||
|
|
||||||
|
suite.T().Run("write", func(t *testing.T) {
|
||||||
|
ioctx, err := suite.conn.OpenIOContext(suite.pool)
|
||||||
|
require.NoError(suite.T(), err)
|
||||||
|
oid := suite.GenObjectName()
|
||||||
|
defer suite.ioctx.Delete(oid)
|
||||||
|
|
||||||
|
v1, _ := ioctx.GetLastVersion()
|
||||||
|
|
||||||
|
err = ioctx.Write(oid, []byte("something to write"), 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
v2, _ := ioctx.GetLastVersion()
|
||||||
|
assert.NotEqual(t, v1, v2)
|
||||||
|
|
||||||
|
v3, _ := ioctx.GetLastVersion()
|
||||||
|
assert.Equal(t, v2, v3)
|
||||||
|
|
||||||
|
err = ioctx.Write(oid, []byte("something completely different"), 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
v4, _ := ioctx.GetLastVersion()
|
||||||
|
assert.NotEqual(t, v1, v4)
|
||||||
|
assert.NotEqual(t, v2, v4)
|
||||||
|
assert.NotEqual(t, v3, v4)
|
||||||
|
})
|
||||||
|
|
||||||
|
suite.T().Run("writeAndRead", func(t *testing.T) {
|
||||||
|
ioctx, err := suite.conn.OpenIOContext(suite.pool)
|
||||||
|
require.NoError(suite.T(), err)
|
||||||
|
oid := suite.GenObjectName()
|
||||||
|
defer ioctx.Delete(oid)
|
||||||
|
|
||||||
|
v1, _ := ioctx.GetLastVersion()
|
||||||
|
|
||||||
|
err = ioctx.Write(oid, []byte("presto"), 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
v2, _ := ioctx.GetLastVersion()
|
||||||
|
assert.NotEqual(t, v1, v2)
|
||||||
|
|
||||||
|
bytes := make([]byte, 1024)
|
||||||
|
_, err = ioctx.Read(oid, bytes, 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
v3, _ := ioctx.GetLastVersion()
|
||||||
|
assert.Equal(t, v2, v3)
|
||||||
|
|
||||||
|
err = ioctx.Write(oid, []byte("abracadabra"), 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
v4, _ := ioctx.GetLastVersion()
|
||||||
|
assert.NotEqual(t, v1, v4)
|
||||||
|
assert.NotEqual(t, v2, v4)
|
||||||
|
assert.NotEqual(t, v3, v4)
|
||||||
|
|
||||||
|
_, err = ioctx.Read(oid, bytes, 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
v5, _ := ioctx.GetLastVersion()
|
||||||
|
assert.Equal(t, v4, v5)
|
||||||
|
})
|
||||||
|
|
||||||
|
suite.T().Run("writeAndReadMultiple", func(t *testing.T) {
|
||||||
|
ioctx, err := suite.conn.OpenIOContext(suite.pool)
|
||||||
|
require.NoError(suite.T(), err)
|
||||||
|
|
||||||
|
oids := make([]string, 5)
|
||||||
|
vers := make([]uint64, 5)
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
oid := suite.GenObjectName()
|
||||||
|
defer ioctx.Delete(oid)
|
||||||
|
err = ioctx.Write(oid, []byte(oid), 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
oids[i] = oid
|
||||||
|
vers[i], _ = ioctx.GetLastVersion()
|
||||||
|
}
|
||||||
|
|
||||||
|
var v uint64
|
||||||
|
bytes := make([]byte, 1024)
|
||||||
|
|
||||||
|
_, err = ioctx.Read(oids[0], bytes, 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
v, _ = ioctx.GetLastVersion()
|
||||||
|
assert.Equal(t, vers[0], v)
|
||||||
|
|
||||||
|
_, err = ioctx.Read(oids[4], bytes, 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
v, _ = ioctx.GetLastVersion()
|
||||||
|
assert.Equal(t, vers[4], v)
|
||||||
|
|
||||||
|
_, err = ioctx.Read(oids[1], bytes, 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
v, _ = ioctx.GetLastVersion()
|
||||||
|
assert.Equal(t, vers[1], v)
|
||||||
|
})
|
||||||
|
|
||||||
|
suite.T().Run("invalidIOContext", func(t *testing.T) {
|
||||||
|
ioctx := &IOContext{}
|
||||||
|
_, err := ioctx.GetLastVersion()
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestRadosTestSuite(t *testing.T) {
|
func TestRadosTestSuite(t *testing.T) {
|
||||||
suite.Run(t, new(RadosTestSuite))
|
suite.Run(t, new(RadosTestSuite))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue