[ 
https://issues.apache.org/jira/browse/ODE-561?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Karthick Sankarachary updated ODE-561:
--------------------------------------

    Attachment: bounded-process-cache.patch

> Process hydration/dehydration improvements to better control memory footprint
> -----------------------------------------------------------------------------
>
>                 Key: ODE-561
>                 URL: https://issues.apache.org/jira/browse/ODE-561
>             Project: ODE
>          Issue Type: Improvement
>          Components: Axis2 Integration, BPEL Compilation/Parsing, BPEL 
> Runtime, JBI Integration
>    Affects Versions: 1.2
>            Reporter: Karthick Sankarachary
>            Assignee: Karthick Sankarachary
>             Fix For: 1.3
>
>         Attachments: bounded-process-cache.patch
>
>   Original Estimate: 336h
>  Remaining Estimate: 336h
>
> At present, the BPEL server stashes the metadata of deployed processes in an 
> in-memory, unbounded cache. Given the unbounded nature of the cache, the 
> server is bound to eventually run out of memory when presented with a 
> sufficiently large process set. The graceful way to handle this situation 
> would be to place bounds on the cache, either in terms of the total size or 
> number of processes that it may contain at any given point in time. While 
> throttling the server this way may effectively reduce its throughput, it is 
> certainly the far lesser evil compared to the alternative.
> To that end, we define the following configurable properties for the benefit 
> of the administrator:
> a) "process.hydration.throttled.maximum.size": The value of this property 
> specifies the maximum size of the metadata of all processes that are 
> currently in-use and may be cached in-memory. If the process metadata was 
> hydrated at least once by the server instance, then its size is calculated 
> once by traversing its object model. If not, then we estimate its in-memory 
> size based on the size of the (.cbp) file where its serialized bytes are 
> persisted.
> b) "process.hydration.throttled.maximum.count": The value of this property 
> specifies the maximum number of processes that are currently in-use and whose 
> metadata may be cached in-memory. 
> A process that is stored on disk but is not loaded in-memory is said to be 
> "unhydrated". When the server receives a message that is targeted at an 
> unhydrated process, we must decide whether or not there is sufficient free 
> memory in the cache for it. If not, then we select the least recently used 
> process as our victim and evict (or dehydrate) it. This check and balance is 
> performed until there is sufficient memory, in which case we may hydrate the 
> process. On the other hand, if the cache capacity is exceeded, then we 
> process the message based on its exchange pattern, as described below:
> i) If the message is one-way (asynchronous), then we queue it back with the 
> job scheduler so that it can be retried later. The hope is that, given a 
> sufficient amount of delay and number of retries, the cache will have enough 
> room for the targeted process.
> ii) If the message is two-way (synchronous), then we cannot simply 
> re-schedule it back, because the client will no doubt timeout. The logical 
> thing to do here is to just return a SOAP fault message that forces the 
> client to handle retries itself, if it so desires.
> Furthermore, the administrator may use the following properties to enable and 
> control lazy-loading:
> c) "process.hydration.lazy":  The value of this property specifies whether or 
> not a process metadata is to be lazy-loaded. If so, then the server will not 
> immediately load process metadata upon startup or deployment. In fact, the 
> process is not hydrated until the server receives a message that demands that 
> that process be loaded in-memory. This is a global property that may be 
> overriden on a process-by-process basis by specifying a value for its 
> namesake in the process' deployment descriptor (deploy.xml) file.
> d) "process.hydration.lazy.minimum.size": The value of this property 
> specifies the approximate minimum size of the process metadata for which 
> lazy-loading should be enabled. If the server calculates the approximate size 
> of the process metadata (based on its serialized file size) to be less than 
> the value specified herein, then it will load the process eagerly. This way, 
> you don't suffer the time delay on hydration for messages that don't deal 
> with large-sized processes.
> Lastly, we introduce the following property to throttle the number of 
> instances that a process may handle:
> e) "process.instance.throttled.maximum.count": The value of this property 
> specifies the maximum number of instances that may be simultaneously active 
> for any given process. This is a global property that may be overriden on a 
> process-by-process basis by specifying a value for its namesake in the 
> process' deployment descriptor (deploy.xml) file. Note that we assume that 
> the process is already hydrated at the time we perform this check and as such 
> this property is not directly related to caching. However, it may have an 
> indirect effect on the cache by virtue of the fact that the it will most 
> likely cause the process to dehydrate sooner rather than later (through 
> dehydration policies).
> PS: Note that the the in-memory representation of process metadata is made up 
> of WSDL and BPEL object models. The cache that we refer to here deals 
> specifically with BPEL objects. For the purposes of this issue, caching of 
> WSDL objects is considered to be out of scope.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to