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.