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

Attach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 2.24.3
    • 2.25.1
    • came-core
    • None
    • 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

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            ldemasi Luigi De Masi
            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

                Slack

                  Issue deployment