[
https://issues.apache.org/jira/browse/IGNITE-18859?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Alexander Lapin updated IGNITE-18859:
-------------------------------------
Summary: PendingComparableValuesTracker extension in order to support
multiple idependent waiters assosiated with values (was:
PartitionReplicaListener extension in order to support multiple idependent
waiters assosiated with values)
> PendingComparableValuesTracker extension in order to support multiple
> idependent waiters assosiated with values
> ---------------------------------------------------------------------------------------------------------------
>
> Key: IGNITE-18859
> URL: https://issues.apache.org/jira/browse/IGNITE-18859
> Project: Ignite
> Issue Type: Improvement
> Reporter: Vladislav Pyatkov
> Assignee: Alexander Lapin
> Priority: Major
> Labels: ignite-3
> Time Spent: 1h 20m
> Remaining Estimate: 0h
>
> h3. Motivation
> In order to implement placement driver API that will add an ability to await
> and get primary replicas in seems reasonable to reuse
> PendingComparableValuesTracker just because given class provides most of
> required functionality.
> {code:java}
> /**
> * Tracker that stores comparable value internally, this value can grow when
> {@link #update(Comparable)} method is called. The tracker gives
> * ability to wait for certain value, see {@link #waitFor(Comparable)}.
> */
> public class PendingComparableValuesTracker<T extends Comparable<T>>
> implements ManuallyCloseable { {code}
> However some upgrades are needed - see the definition of done section.
> h3. Definition of done
> * It's required to have an ability to complete pending waiter with specific
> value propagated to an PendingComparableValuesTracker#update() method.
> * It's required to support multiple independent waiters associated with same
> waiter key.
> h3. Implementation notes
> It make sense to extend PendingComparableValuesTracker with a new class that
> will store multiple independent waiters instead of single one, in other words
> {code:java}
> private final ConcurrentSkipListMap<T, Set<CompletableFuture<R>>>
> valueFutures = new ConcurrentSkipListMap<>(); {code}
> instead of
> {code:java}
> private final ConcurrentSkipListMap<T, CompletableFuture<R>> valueFutures =
> new ConcurrentSkipListMap<>();{code}
> In addition to that it makes sense to overload
> {code:java}
> public void update(T newValue) {code}
> with
> {code:java}
> public void update(T newValue, @Nullable R futureResult) {code}
> in order to retrieve CompletableFuture<R> from
> PendingComparableValuesTracker#waitFor() instead of CompletableFuture<Void>.
> Of course it's valid to have Void as R.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)