Improve segmented journal actor metrics
[controller.git] / opendaylight / md-sal / eos-dom-akka / src / main / java / org / opendaylight / controller / eos / akka / owner / supervisor / AbstractSupervisor.java
1 /*
2  * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.eos.akka.owner.supervisor;
9
10 import akka.actor.typed.ActorRef;
11 import akka.actor.typed.Behavior;
12 import akka.actor.typed.javadsl.AbstractBehavior;
13 import akka.actor.typed.javadsl.ActorContext;
14 import akka.cluster.ddata.ORMap;
15 import akka.cluster.ddata.ORSet;
16 import akka.cluster.ddata.typed.javadsl.DistributedData;
17 import akka.cluster.ddata.typed.javadsl.Replicator;
18 import akka.cluster.ddata.typed.javadsl.ReplicatorMessageAdapter;
19 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
20 import java.time.Duration;
21 import org.opendaylight.controller.eos.akka.owner.supervisor.command.ClearCandidates;
22 import org.opendaylight.controller.eos.akka.owner.supervisor.command.ClearCandidatesForMember;
23 import org.opendaylight.controller.eos.akka.owner.supervisor.command.ClearCandidatesResponse;
24 import org.opendaylight.controller.eos.akka.owner.supervisor.command.OwnerSupervisorCommand;
25 import org.opendaylight.controller.eos.akka.registry.candidate.CandidateRegistry;
26 import org.opendaylight.mdsal.eos.dom.api.DOMEntity;
27 import org.slf4j.Logger;
28
29 abstract class AbstractSupervisor extends AbstractBehavior<OwnerSupervisorCommand> {
30
31     final ReplicatorMessageAdapter<OwnerSupervisorCommand, ORMap<DOMEntity, ORSet<String>>> candidateReplicator;
32
33     @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR",
34         justification = "getContext() is non-final")
35     AbstractSupervisor(final ActorContext<OwnerSupervisorCommand> context) {
36         super(context);
37
38         final ActorRef<Replicator.Command> replicator = DistributedData.get(getContext().getSystem()).replicator();
39         candidateReplicator = new ReplicatorMessageAdapter<>(getContext(), replicator, Duration.ofSeconds(5));
40     }
41
42     Behavior<OwnerSupervisorCommand> onClearCandidatesForMember(final ClearCandidatesForMember command) {
43         getLogger().debug("Clearing candidates for member: {}", command.getCandidate());
44
45         candidateReplicator.askGet(
46                 askReplyTo -> new Replicator.Get<>(CandidateRegistry.KEY,
47                         new Replicator.ReadMajority(Duration.ofSeconds(15)), askReplyTo),
48                 response -> new ClearCandidates(response, command));
49
50         return this;
51     }
52
53     Behavior<OwnerSupervisorCommand> finishClearCandidates(final ClearCandidates command) {
54         if (command.getResponse() instanceof Replicator.GetSuccess) {
55             getLogger().debug("Retrieved candidate data, clearing candidates for {}",
56                     command.getOriginalMessage().getCandidate());
57
58             getContext().spawnAnonymous(CandidateCleaner.create()).tell(command);
59         } else {
60             getLogger().debug("Unable to retrieve candidate data for {}, no candidates present sending empty reply",
61                     command.getOriginalMessage().getCandidate());
62             command.getOriginalMessage().getReplyTo().tell(new ClearCandidatesResponse());
63         }
64
65         return this;
66     }
67
68     abstract Logger getLogger();
69 }