diff --git a/cephfs/path.go b/cephfs/path.go index c01e68d..cb5aa73 100644 --- a/cephfs/path.go +++ b/cephfs/path.go @@ -173,3 +173,22 @@ func (mount *MountInfo) Rename(from, to string) error { ret := C.ceph_rename(mount.mount, cFrom, cTo) return getError(ret) } + +// Truncate sets the size of the specified file. +// +// Implements: +// int ceph_truncate(struct ceph_mount_info *cmount, const char *path, int64_t size); +func (mount *MountInfo) Truncate(path string, size int64) error { + if err := mount.validate(); err != nil { + return err + } + cPath := C.CString(path) + defer C.free(unsafe.Pointer(cPath)) + + ret := C.ceph_truncate( + mount.mount, + cPath, + C.int64_t(size), + ) + return getError(ret) +} diff --git a/cephfs/path_test.go b/cephfs/path_test.go index 127c820..3a8c19c 100644 --- a/cephfs/path_test.go +++ b/cephfs/path_test.go @@ -399,3 +399,52 @@ func TestRename(t *testing.T) { assert.NoError(t, mount.RemoveDir(n2)) }) } + +func TestTruncate(t *testing.T) { + mount := fsConnect(t) + defer fsDisconnect(t, mount) + + fname := "TestTruncate.txt" + defer mount.Unlink(fname) + + // "touch" the file + f, err := mount.Open(fname, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + assert.NoError(t, err) + assert.NoError(t, f.Close()) + + t.Run("invalidMount", func(t *testing.T) { + m := &MountInfo{} + err := m.Truncate(fname, 0) + assert.Error(t, err) + }) + + t.Run("invalidSize", func(t *testing.T) { + err := mount.Truncate(fname, -1) + assert.Error(t, err) + }) + + t.Run("invalidPath", func(t *testing.T) { + err := mount.Truncate(".Non~Existant~", 0) + assert.Error(t, err) + }) + + t.Run("valid", func(t *testing.T) { + err := mount.Truncate(fname, 1024) + assert.NoError(t, err) + + st, err := mount.Statx(fname, StatxBasicStats, 0) + if assert.NoError(t, err) { + assert.NotNil(t, st) + assert.EqualValues(t, 1024, st.Size) + } + + err = mount.Truncate(fname, 0) + assert.NoError(t, err) + + st, err = mount.Statx(fname, StatxBasicStats, 0) + if assert.NoError(t, err) { + assert.NotNil(t, st) + assert.EqualValues(t, 0, st.Size) + } + }) +}