For others that don't realize, the discussion of this is happening on the
pull request here:

https://github.com/apache/arrow/pull/5526

On Fri, Sep 27, 2019 at 4:52 AM Fan Liya <liya.fa...@gmail.com> wrote:

> Dear all,
>
> When releasing an ArrowBuf, we will run the following piece of code:
>
> private int decrement(int decrement) {
>   allocator.assertOpen();
>   final int outcome;
>   synchronized (allocationManager) {
>     outcome = bufRefCnt.addAndGet(-decrement);
>       if (outcome == 0) {
>         lDestructionTime = System.nanoTime();
> allocationManager.release(this);
>       }
>
>   }
>   return outcome;
> }
>
> It can be seen that we need to acquire the lock for allocation manager
> lock, no matter if we need to release the buffer. In addition, the
> operation of decrementing refcount is only carried out after the lock is
> acquired. This leads to unnecessary lock contention, and may degrade
> performance.
>
> We propose to change the code like this:
>
> private int decrement(int decrement) {
>   allocator.assertOpen();
>   final int outcome;
>   outcome = bufRefCnt.addAndGet(-decrement);
>   if (outcome == 0) {
>     lDestructionTime = System.nanoTime();
>     synchronized (allocationManager) {
>      allocationManager.release(this);
>     }
>   }
>   return outcome;
> }
>
> Note that this change can be dangerous, as it lies in the core of our code
> base, so we should be careful with it. On the other hand, it may have
> non-trivial performance implication. For example, when a distributed task
> is getting closed, a large number of ArrowBuf will be closed
> simultaneously. If we reduce the range of the synchronization block, we can
> significantly improve the performance.
>
> Would you please give your valueable feedback?
>
>
> Best,
>
> Liya Fan
>

Reply via email to