Bug #39796 Falcon: Reference count decrement not atomic

Submitted: 1 Oct 2008 23:26 Modified: 8 Jan 2009 10:50
Reporter: Christopher Powers Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Falcon storage engine Severity:S1 (Critical)
Version: OS:Any
Assigned to: Christopher Powers CPU Architecture:Any
Tags: F_INDEX

[1 Oct 2008 23:26] Christopher Powers
Description:
Transaction::release() and DeferredIndex::release() are not atomic, and may result in an incorrect reference count, memory leak or crash.

How to repeat:
Discovered via debugging. Not explicitly reproducible.

Suggested fix:
The problem is that useCount is checked after the interlocked decrement, allowing the opportunity for another thread to alter useCount before it is evaluated for 0.

int Transaction::release()
{
    int count = INTERLOCKED_DECREMENT(useCount);

    >>> GAP <<<<

    if (count == 0)
        delete this;

    return count;
}

void DeferredIndex::releaseRef()
{
    ASSERT(useCount > 0);

    INTERLOCKED_DECREMENT(useCount);

    >>> GAP <<<<

    if (useCount == 0)
        delete this;
}

The correct code does not allow for an intermediate context switch, and is consistent with the other implementations of ::release() within Falcon:

void Transaction::release()
{
    if (INTERLOCKED_DECREMENT(useCount) == 0)
        delete this;
}

void DeferredIndex::releaseRef()
{
    if (INTERLOCKED_DECREMENT(useCount) == 0)
        delete this;
}
[1 Oct 2008 23:27] Christopher Powers
Verified via debugging other problems.
[2 Oct 2008 0:12] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/54992

2845 Christopher Powers	2008-10-01
      Bug#39711 "Running falcon_bug_34351_C shows increasing memory usage"
      Bug#39795 "Falcon: Online add index does not support index with non-null columns"
      Bug#39796 "Falcon: Reference count decrement not atomic"
[2 Oct 2008 0:13] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/54993

2845 Christopher Powers	2008-10-01
      Bug#39711 "Running falcon_bug_34351_C shows increasing memory usage"
      Bug#39795 "Falcon: Online add index does not support index with non-null columns"
      Bug#39796 "Falcon: Reference count decrement not atomic"
[2 Oct 2008 0:16] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/54994

2845 Christopher Powers	2008-10-01
      Bug#39711 "Running falcon_bug_34351_C shows increasing memory usage"
      Bug#39795 "Falcon: Online add index does not support index with non-null columns"
      Bug#39796 "Falcon: Reference count decrement not atomic"
[2 Oct 2008 23:26] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/55158

2848 Christopher Powers	2008-10-02
      Bug#39796, "Falcon: Reference count decrement not atomic"
      
      The release() method in Transaction and DeferredIndex check useCount after the interlocked decrement, allowing other threads to alter useCount before it is evaluated for 0.
[8 Jan 2009 10:50] MC Brown
Internal only. No documentation needed.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.065 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.