Hi Andrey, Thanks for your reply. The `ReferenceCountUtil.release` will bring convenient in the following case ```java ByteBuf buf; try { buf = allocate(); } finally { ReferenceCountUtil.release(buf); } ``` If there is no objections, I will start a vote to replace `ReferenceCountUtil. safeRelease()` with `ReferenceCountUtil.release()`.
Thanks, Hang Andrey Yegorov <andrey.yego...@datastax.com> 于2023年2月3日周五 08:24写道: > > Netty recommends to NOT use .safeRelease() unless one absolutely needs to > swallow an exception: > https://github.com/netty/netty/blob/48adb2609c7210ff55bb2ae42772a579052d06e7/common/src/main/java/io/netty/util/ReferenceCountUtil.java#L107-L112 > > .release() is a convenient way to bypass null check if the object may > happen to be null e.g. in the finally block when it is possible that > allocation didn't happen. > though BK's code still does the null check and then uses .release(). > > I am not really sure why safeRelease() spread so much, maybe it was a quick > way to deal with errors in unit tests caused by improper setup/tearDown. > > On an unrelated note, while looking through all that code I noticed that > memetable uses NIO ByteBuffers. > so naturally for the netty's ByteBuf entry has to be copied into nio buffer: > "memTable.addEntry(ledgerId, entryId, entry.nioBuffer(), this)" > And after getEntry() it is wrapped into netty's ByteBuf. > I wonder if switching it to ByteBuf would improve performance / reduce java > GC load. > > > On Wed, Feb 1, 2023 at 1:28 AM Hang Chen <chenh...@apache.org> wrote: > > > > +1 , use new specification (ReferenceCountUtil.release) replace BP-59 > > > > > I think it makes sense to replace ReferenceCountUtil.safeRelease > > with ReferenceCountUtil.release. > > FWIW ReferenceCountUtil.release's return value just says if the byte buf's > > ref count reached zero or not, it is not an error handling mechanism. > > > > The `ReferenceCountUtil.release` checks whether the ByteBuf is > > `ReferenceCounted`. If not, it will do nothing and return false. > > ```java > > public static boolean release(Object msg) { > > return msg instanceof ReferenceCounted ? > > ((ReferenceCounted)msg).release() : false; > > } > > ``` > > All the use cases in BookKeeper about `ReferenceCountUtil.release` are > > not check the returned value. > > Even Though all the ByteBuf in BookKeeper code are ReferenceCounted, > > it still has risk of causing direct memory leak. One example is [1] > > > > My question is why not use `ByteBuf.release()` directly? > > > > > > [1] https://github.com/apache/bookkeeper/issues/3527 > > > > Thanks, > > Hang > > > > Enrico Olivelli <eolive...@gmail.com> 于2023年2月1日周三 15:35写道: > > > > > > Horizon > > > > > > Il giorno lun 30 gen 2023 alle ore 11:14 Horizon > > > <1060026...@qq.com.invalid> ha scritto: > > > > > > > > Hi, Enrico. Just confirm, only revert > > https://github.com/apache/bookkeeper/pull/3528, it work well? > > > > > > yes > > > This is the only thing we reverted in our fork > > > > > > see the history > > > https://github.com/datastax/bookkeeper/commits/ds-4.14 > > > > > > but I don't have all of the other commits in the history, > > > so maybe other changes may be bad > > > > > > Unfortunately currently we (both BookKeeper community and in my > > > company) don't have > > > dedicated tests for BookKeeper but only for Pulsar, > > > that makes things harder to track > > > > > > probably we should build some automated performance test: > > > a set of scripts that create a BK cluster on k8s, run some > > > benchmarks/heavy load, verify that everything worked well > > > The workbench should be re-usable by anyone, I am not saying that we > > > should spend the ASF resources to run > > > this kind of tests, but that we should provide a reference load test. > > > > > > > > > Enrico > > > > > > > > > > > > 2023年1月30日 16:04,Enrico Olivelli <eolive...@gmail.com> 写道: > > > > > > > > > > I think that we must do something, current master branch is not > > stable. > > > > > > > > > > My colleague Massimiliano opened this issue > > > > > https://github.com/apache/bookkeeper/issues/3751 > > > > > > > > > > Basically in the current master there is some problem that leads to > > > > > Netty BytBuf corruption. > > > > > > > > > > The problem is solved by reverting this PR > > > > > https://github.com/apache/bookkeeper/pull/3528 Fix memory leak when > > > > > reading entry but the connection disconnected > > > > > > > > > > Enrico > > > > > > > > > > Il giorno lun 30 gen 2023 alle ore 08:04 steven lu > > > > > <lushiji2...@gmail.com> ha scritto: > > > > >> > > > > >> There are three ways to write release in current pulsar and > > bookkeeper > > > > >> projects: > > > > >> 1.ByteBuf.release: Call release directly without handling any > > exceptions; > > > > >> 2.ReferenceCountUtil.release: return processing status; > > > > >> 3. ReferenceCountUtil.safeRelease: without return value, print > > exception > > > > >> information > > > > >> > > > > >> I don't think it is necessary to revert these PRs. We can discuss > > what is > > > > >> the correct way to release, and then modify these three ways into > > the > > > > >> correct way. > > > > >> > > > > >> Hang Chen <chenh...@apache.org> 于2023年1月30日周一 12:28写道: > > > > >> > > > > >>> Hi guys, > > > > >>> In BP-59, which was not discussed in the dev mail list and > > without > > > > >>> a vote, refactored the ByteBuf release method by > > > > >>> ReferenceCountUtil.safeRelease() instead of ByteBuf.release(). > > > > >>> > > > > >>> In the `ReferenceCountUtil.safeRelease()`, it catches the release > > > > >>> exception. This change can make the ByteBuf release without any > > > > >>> exceptions and makes the code run well, but it will make bugs hide > > > > >>> deeper and more challenging to find out. > > > > >>> ```java > > > > >>> public static void safeRelease(Object msg) { > > > > >>> try { > > > > >>> release(msg); > > > > >>> } catch (Throwable t) { > > > > >>> logger.warn("Failed to release a message: {}", msg, t); > > > > >>> } > > > > >>> } > > > > >>> ``` > > > > >>> For example, if there is a bug to release the ByteBuf twice, whose > > > > >>> refcnt is 1, we can find out the bug quickly if we use > > > > >>> ByteBuf.release(), but the bug will be hard to find out if we use > > > > >>> `ReferenceCountUtil.safeRelease()` > > > > >>> > > > > >>> There are 12 PRs to refactor the ByteBuf release method, and I > > suggest > > > > >>> reverting those PRs. Do you have any ideas? > > > > >>> > > > > >>> https://github.com/apache/bookkeeper/pull/3673 > > > > >>> https://github.com/apache/bookkeeper/pull/3674 > > > > >>> https://github.com/apache/bookkeeper/pull/3687 > > > > >>> https://github.com/apache/bookkeeper/pull/3688 > > > > >>> https://github.com/apache/bookkeeper/pull/3689 > > > > >>> https://github.com/apache/bookkeeper/pull/3691 > > > > >>> https://github.com/apache/bookkeeper/pull/3693 > > > > >>> https://github.com/apache/bookkeeper/pull/3694 > > > > >>> https://github.com/apache/bookkeeper/pull/3695 > > > > >>> https://github.com/apache/bookkeeper/pull/3698 > > > > >>> https://github.com/apache/bookkeeper/pull/3700 > > > > >>> https://github.com/apache/bookkeeper/pull/3703 > > > > >>> > > > > >>> > > > > >>> Thanks, > > > > >>> Hang > > > > >>> > > > > > > > > > -- > Andrey Yegorov