]
Paul Ferraro updated WFLY-12581:
--------------------------------
Attachment: (was: Schedulers for local workloads.png)
Optimize distributed web/ejb expiration schedulers
--------------------------------------------------
Key: WFLY-12581
URL:
https://issues.jboss.org/browse/WFLY-12581
Project: WildFly
Issue Type: Enhancement
Components: Clustering
Affects Versions: 18.0.0.Beta1
Reporter: Paul Ferraro
Assignee: Paul Ferraro
Priority: Major
Attachments: Schedulers for distributed workloads.png, Schedulers for local
workloads.png
WF18 added a new expiration scheduler implementation for SFSBs specifically optimized for
non-distributed environments. The key features of this implementations are:
* Uses a single scheduled task instead of a scheduled task per SFSB
* Uses a double-linked list to track SFSBs to be expired
The use of a linked queue is based on the following assumptions:
# All SFSB using a given scheduler share the same @StatefulTimeout
# A given call to Scheduler.schedule(...) is always the last item to be scheduled
Distributed SFSBs cannot use the same implementation because the second assumption is not
valid, as a member may assume the responsibility of expiring a SFSB previously owned by
another member. They can, however, leverage the strategy of using a single scheduled task
instead of a task per SFSB. Due to the nature of the scheduler, that most scheduled tasks
will be cancelled/removed and rescheduled, this strategy outperforms the current
implementation.
This jira proposes the following:
* Generalize the Scheduler interface for reuse between SFSBs and web sessions.
* Generalize the new local scheduler implementation such that the same scheduler can
support both local and distributed SFSBs using different queue implementations for
tracking scheduled items
* Distributed use case uses a PriorityBlockingQueue, which has O(log N) add/remove
characteristics
* Replace ExpirationTracker with a ConcurrentDirectDeque to support local case, which has
O(1) add/remove characteristics
** ConcurrentDirectDeque outperforms ExpirationTracker under concurrent load
Local web session expiration cannot use the same expiration scheduler used by local SFSBs
because the first assumption is not valid, since a given web session can override the
default max inactive interval. However, we can still optimize the local web session case
by delegating expiration to the PriorityBlockingQueue-based implementation if the session
uses a non-default max inactive interval, and to the ConcurrentDirectDeque-based
implementation if the session uses the default max inactive interval.