From 5bb75604fa5f84b60f9d344219fe46c34eba9a7b Mon Sep 17 00:00:00 2001 From: Nick Janus Date: Tue, 14 Mar 2023 16:23:30 -0400 Subject: [PATCH] rados: free object list results after listing This fixes a memory leak that becomes substantial across large pools. Signed-off-by: Nick Janus --- rados/ioctx.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rados/ioctx.go b/rados/ioctx.go index bbe03fa..e6e35bf 100644 --- a/rados/ioctx.go +++ b/rados/ioctx.go @@ -332,7 +332,8 @@ func (ioctx *IOContext) ListObjects(listFn ObjectListFunc) error { defer C.rados_object_list_cursor_free(ioctx.ioctx, finish) for { - ret := C.rados_object_list(ioctx.ioctx, next, finish, pageResults, nil, filterLen, (*C.rados_object_list_item)(unsafe.Pointer(&results[0])), &next) + res := (*C.rados_object_list_item)(unsafe.Pointer(&results[0])) + ret := C.rados_object_list(ioctx.ioctx, next, finish, pageResults, nil, filterLen, res, &next) if ret < 0 { return getError(ret) } @@ -342,6 +343,7 @@ func (ioctx *IOContext) ListObjects(listFn ObjectListFunc) error { item := results[i] listFn(C.GoStringN(item.oid, (C.int)(item.oid_length))) } + C.rados_object_list_free(C.size_t(ret), res) if C.rados_object_list_is_end(ioctx.ioctx, next) == listEndSentinel { return nil