Hi all, I noticed there is a difference of opinion for whether to recycle failed recyclable objects. [1][2][3] So I'd like to open the discussion in the mail list.
Netty recycler is an object pool to reduce GC pressure for frequently created and discarded objects. If a recyclable object fails, e.g. when an `OpAddEntry` encounters an unexpected exception, IMO, it's reasonable not to recycle it. When a recyclable object is not recycled, it just won't be reused from the object pool. The worst case is that the memory of the whole object pool is exhausted. After that It's true that if such objects are not recycled, there will be a "memory leak". However, the worst result is that the pool memory is exhausted. In this case, it will fall back to allocating objects via the `newObject` method with a dummy handle [4]. The implementation of this method usually allocates memory from JVM. In such cases, the recyclable object will eventually be garbage collected. It's actually not a memory leak. Recyclable objects usually have short life timing, for example, an `OpAddEntry` object is created when starting an asynchronous send and recycled after the send is done. The object is never referenced by any other object, so even if it's allocated from JVM, it will eventually be garbage collected. The benefit to skip recycling objects for failures is that for rare cases, retaining the object could help diagnose issues that are hard to reproduce. Still take `OpAddEntry` for example, if it encountered an unexpected exception, recycling it could set all fields with null, so it's hard to know which ledger it belongs to (and other useful fields) from the heap dump. [1] https://github.com/apache/pulsar/pull/24515#discussion_r2212602435 [2] https://github.com/apache/pulsar/pull/24522#discussion_r2210814071 [3] https://github.com/apache/pulsar/pull/24522#discussion_r2213100905 [4] https://github.com/netty/netty/blob/ab2d2cf3ff3a6f055368405af7f6e9dd5b8d144e/common/src/main/java/io/netty/util/Recycler.java#L189 Thanks, Yunze