Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-14432

camel-salesforce - Memory leak when toD is used with cacheSize < 0 in Camel 2.x

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.24.3
    • Fix Version/s: 2.25.1
    • Component/s: came-core
    • Labels:
      None
    • Estimated Complexity:
      Unknown

      Description

      Only Camel 2.X is affected by this issue. 

      When toD EIP is used and producer cache is disabled, producers' stop method is not invoked after the exchange is sent. This could lead to a memory leak for some components.

      To reproduce this issue, configure the salesforce credentials in application.properties and start the camel route of the attached reproducer.

      run the following commad:

      PID=$(ps aux | grep CamelSalesforceExample | grep -v grep | awk '{print $2}'); jcmd ${PID} GC.run; jmap -histo ${PID} | grep DefaultRest

       

      The route invokes the producer endpoint 5 times, 5 DefaultRestClient objects are still remained in the heap

       

      The bug is in the implementation of toD (camel-core) and only happens when producer cache is disabled (cacheSize < 0).
      The logic behind "dynamic to EIP" is implemented in SendDynamicProcessor class. When the producer cache is disabled, SendDynamicProcessor instantiate an EmptyProducerCache class, a subclass of ProducerCache that mimic the behavior of his parent creating a new producer in acquireProducer method and stopping and disposing the producer in releaseProducer method.
      After resolving the dynamic uri, SendDynamicProcessor sends the exchange to the endpoint using ProducerCache.doInAsyncProducer
      that in its implementation is not using acquireProducer and releaseProducer methods to create and dispose the producer. As a consequence of this, a new producer is created and started but not stopped, producer get unreferenced and garbage-collected while in started state and so DefaultRestClient is not removed from SaleforceSession.

      A possible workaround is to enable producer cache, setting cacheSize with a value greater than 0, in this way ProducerCache will use an LRUCache that stops the producer when an eviction occurs. 

       

        Attachments

        1. camel-salesforce-upstream.zip
          10 kB
          Luigi De Masi

          Issue Links

            Activity

              People

              • Assignee:
                ldemasi Luigi De Masi
                Reporter:
                ldemasi Luigi De Masi
              • Votes:
                0 Vote for this issue
                Watchers:
                1 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:

                  Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 20m
                  20m