[ https://issues.apache.org/jira/browse/IGNITE-18859?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexander Lapin updated IGNITE-18859: ------------------------------------- Description: 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. was: *Motivation* A placement driver should provide a primary node for each replication group in all cluster nodes. The node will be used as a destination to send a replica request that should be processed by primary. *Implementation notes* The primary replicas are stored in Metastorage in keys with _prefix placementdriver.lease.holder_<REPLICATION_GROUP_ID>. Also, the key will be able to use to update list of primary nodes. > PartitionReplicaListener 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 > > 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)