Use simple Registration in ClusterSingletonServiceProvider
[mdsal.git] / singleton-service / mdsal-singleton-dom-impl / src / main / java / org / opendaylight / mdsal / singleton / dom / impl / ClusterSingletonServiceGroup.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. 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.mdsal.singleton.dom.impl;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import org.eclipse.jdt.annotation.Nullable;
12 import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException;
13 import org.opendaylight.mdsal.eos.common.api.EntityOwnershipStateChange;
14 import org.opendaylight.mdsal.eos.dom.api.DOMEntity;
15 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
16 import org.opendaylight.yangtools.concepts.Identifiable;
17
18 /**
19  * {@link ClusterSingletonServiceGroup} maintains a group of {@link ClusterSingletonService} instances.
20  * All EntityOwnershipChange notifications have to applied to all registered services at the same time in the same
21  * manner. All registered services have only one instantiated service instance in a cluster at one time on same
22  * Cluster Node. This is realized via a double candidate approach where a service group instance maintains a candidate
23  * registration for ownership of the service entity in the cluster and also a registration that acts as a guard to
24  * ensure a service group instance has fully closed prior to relinquishing service ownership. To achieve ownership
25  * of the service group, a service group candidate must hold ownership of both these entities.
26  *
27  * @param <P> the instance identifier path type
28  * @param <E> the GenericEntity type
29  */
30 // FIXME: rename to ServiceGroup and seal
31 abstract class ClusterSingletonServiceGroup implements Identifiable<String> {
32     /**
33      * This method must be called once on startup to initialize this group and register the relevant group entity
34      * candidate. It means create relevant Group Entity Candidate Registration.
35      */
36     abstract void initialize() throws CandidateAlreadyRegisteredException;
37
38     /**
39      * This method registers a service instance for this service group. If the local node has ownership of the service
40      * group, the {@link ClusterSingletonService#instantiateServiceInstance()} method is called. Otherwise, the method
41      * is called once the local node gains ownership.
42      *
43      * @param service instance
44      */
45     abstract void registerService(ServiceRegistration reg);
46
47     /**
48      * Method provides possibility to restart some service from group without change leadership for whole group.
49      * {@link ServiceRegistration#removeRegistration()} implementation has to call this service.
50      *
51      * <p>
52      * Candidates are signed for group, so unregistration for group with one service has to trigger new election only
53      * otherwise we can see same behavior as on server without clustering.
54      *
55      * @param service instance
56      * @return Future which completes when this instance is shutdown if this was the last registration, null otherwise
57      */
58     abstract @Nullable ListenableFuture<?> unregisterService(ServiceRegistration reg);
59
60     /**
61      * Method implementation has to apply ownershipChange for all registered services.
62      *
63      * @param entity the entity whose ownership status changed
64      * @param change the change the entity underwent
65      * @param inJeopardy {@code true} if ownership is in jeopardy and the reported change may be inaccurate
66      */
67     abstract void ownershipChanged(DOMEntity entity, EntityOwnershipStateChange change, boolean inJeopardy);
68
69     /**
70      * Closes this service group. All registered service providers are also closed. Please be careful
71      * and use this method without active EOS listener only.
72      *
73      * @return {@link ListenableFuture} in list for all Future from closing {@link ClusterSingletonService}
74      */
75     abstract ListenableFuture<?> closeClusterSingletonGroup();
76 }
77