That may be. The thing that is a little tricky is that technically the mgmt code can be run in a handful of different modes (thread pool, thread per op, polling etc.) and we weren't entirely sure if one of the other modes would need the entry to survive longer than the complete_op() function or not. This patch specifically fixes the leak for the threaded-queue mode that trove-directio uses and ignores the other cases since we have no convenient way to test them.

I kind of doubt anyone will ever use the other modes, though. Maybe it is more practical in the long term to do the cleanup inside of complete_op, but then also get rid of the code for the other N modes to simplify things and make it so we don't have to worry about the other paths?

-Phil

On 07/07/2011 06:12 PM, Becky Ligon wrote:
Yes. I agree. That's exactly what I had found, too, but I think that code belongs inside of the PINT_manager_complete_op function. Thoughts?

Becky

On Thu, Jul 7, 2011 at 5:06 PM, Benjamin Severs <[email protected] <mailto:[email protected]>> wrote:

    Thanks to some direction by Phil Carns, we've managed to correct
    the memory
    leak that was affecting directio operations.  Below is the patch
    that addresses
    the issue.  The problem was that once all the *fast* calls were
    switched to
    *safe* calls, the proper cleanup routines were never being called.
     We simply
    placed the cleanup logic that was present in the
    PINT_context_test_* methods
    after the PINT_manager_complete_op call.

    diff --git a/src/common/mgmt/pint-worker-threaded-queues.c
    b/src/common/mgmt/pint-worker-threaded-queues.c
    index 1359768..a088e3f 100644
    --- src/common/mgmt/pint-worker-threaded-queues.c
    +++ src/common/mgmt/pint-worker-threaded-queues.c
    @@ -423,6 +423,7 @@ static void
    *PINT_worker_queues_thread_function(void *
    ptr)
                {
                    for(i = 0; i < op_count; ++i)
                    {
    +                    struct PINT_op_entry *op_entry;
                        op = PINT_op_from_qentry(qentries[i]);
                        /* service the operation */
                        ret = PINT_manager_service_op(
    @@ -440,6 +441,14 @@ static void
    *PINT_worker_queues_thread_function(void *
    ptr)
                            /* fatal if we can't complete an op */
                            goto free_ops;
                        }
    +
    +                    op_entry = id_gen_safe_lookup(op->id);
    +                    if(op_entry)
    +                    {
    +                      id_gen_safe_unregister(op_entry->op.id
    <http://op.id>);
    +                      free(op_entry);
    +                      op_entry = NULL;
    +                    }
                    }
                }
            }

    --
    Benjamin Severs
    _______________________________________________
    Pvfs2-developers mailing list
    [email protected]
    <mailto:[email protected]>
    http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers




--
Becky Ligon
OrangeFS Support and Development
Omnibond Systems
Anderson, South Carolina



_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers

_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers

Reply via email to