serviceGroup = existing;
}
- serviceGroup.registerService(service);
- return new AbstractClusterSingletonServiceRegistration(service) {
+ final ClusterSingletonServiceRegistration reg = new AbstractClusterSingletonServiceRegistration(service) {
@Override
protected void removeRegistration() {
// We need to bounce the unregistration through a ordered lock in order not to deal with asynchronous
// shutdown of the group and user registering it again.
- AbstractClusterSingletonServiceProviderImpl.this.removeRegistration(serviceIdentifier, service);
+ AbstractClusterSingletonServiceProviderImpl.this.removeRegistration(serviceIdentifier, this);
}
};
+
+ serviceGroup.registerService(reg);
+ return reg;
}
private ClusterSingletonServiceGroup<P, E, C> createGroup(final String serviceIdentifier,
- final List<ClusterSingletonService> services) {
+ final List<ClusterSingletonServiceRegistration> services) {
return new ClusterSingletonServiceGroupImpl<>(serviceIdentifier, entityOwnershipService,
createEntity(SERVICE_ENTITY_TYPE, serviceIdentifier),
createEntity(CLOSE_SERVICE_ENTITY_TYPE, serviceIdentifier), services);
}
}
- void removeRegistration(final String serviceIdentifier, final ClusterSingletonService service) {
+ void removeRegistration(final String serviceIdentifier, final ClusterSingletonServiceRegistration reg) {
final PlaceholderGroup<P, E, C> placeHolder;
final ListenableFuture<?> future;
synchronized (this) {
final ClusterSingletonServiceGroup<P, E, C> lookup = verifyNotNull(serviceGroupMap.get(serviceIdentifier));
- if (!lookup.unregisterService(service)) {
+ if (!lookup.unregisterService(reg)) {
return;
}
future = lookup.closeClusterSingletonGroup();
placeHolder = new PlaceholderGroup<>(lookup, future);
- final String identifier = service.getIdentifier().getValue();
+ final String identifier = reg.getInstance().getIdentifier().getValue();
verify(serviceGroupMap.replace(identifier, lookup, placeHolder));
LOG.debug("Replaced group {} with {}", serviceIdentifier, placeHolder);
}
final String identifier = placeHolder.getIdentifier();
LOG.debug("Service group {} closed", identifier);
- final List<ClusterSingletonService> services = placeHolder.getServices();
+ final List<ClusterSingletonServiceRegistration> services = placeHolder.getServices();
if (services.isEmpty()) {
// No services, we are all done
if (serviceGroupMap.remove(identifier, placeHolder)) {
import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipListener;
import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipService;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
import org.opendaylight.yangtools.concepts.Path;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final ReentrantLock lock = new ReentrantLock(true);
@GuardedBy("lock")
- private final List<ClusterSingletonService> serviceGroup;
+ private final List<ClusterSingletonServiceRegistration> serviceGroup;
/*
* State tracking is quite involved, as we are tracking up to four asynchronous sources of events:
* @param services Services list
*/
ClusterSingletonServiceGroupImpl(final String identifier, final S entityOwnershipService, final E mainEntity,
- final E closeEntity, final List<ClusterSingletonService> services) {
+ final E closeEntity, final List<ClusterSingletonServiceRegistration> services) {
Preconditions.checkArgument(!identifier.isEmpty(), "Identifier may not be empty");
this.identifier = identifier;
this.entityOwnershipService = Preconditions.checkNotNull(entityOwnershipService);
}
@Override
- void registerService(final ClusterSingletonService service) {
+ void registerService(final ClusterSingletonServiceRegistration reg) {
+ final ClusterSingletonService service = reg.getInstance();
Verify.verify(identifier.equals(service.getIdentifier().getValue()));
checkNotClosed();
"Service group %s is not initialized yet", identifier);
LOG.debug("Adding service {} to service group {}", service, identifier);
- serviceGroup.add(service);
+ serviceGroup.add(reg);
switch (localServicesState) {
case STARTED:
@CheckReturnValue
@Override
- boolean unregisterService(final ClusterSingletonService service) {
+ boolean unregisterService(final ClusterSingletonServiceRegistration reg) {
+ final ClusterSingletonService service = reg.getInstance();
Verify.verify(identifier.equals(service.getIdentifier().getValue()));
checkNotClosed();
// There is a slight problem here, as the type does not match the list type, hence we need to tread
// carefully.
if (serviceGroup.size() == 1) {
- Verify.verify(serviceGroup.contains(service));
+ Verify.verify(serviceGroup.contains(reg));
return true;
}
- Verify.verify(serviceGroup.remove(service));
+ Verify.verify(serviceGroup.remove(reg));
LOG.debug("Service {} was removed from group.", service.getIdentifier().getValue());
switch (localServicesState) {
}
LOG.debug("Service group {} starting services", identifier);
- serviceGroup.forEach(service -> {
+ serviceGroup.forEach(reg -> {
+ final ClusterSingletonService service = reg.getInstance();
LOG.debug("Starting service {}", service);
try {
service.instantiateServiceInstance();
localServicesState = ServiceState.STOPPING;
final List<ListenableFuture<?>> serviceCloseFutureList = new ArrayList<>(serviceGroup.size());
- for (final ClusterSingletonService service : serviceGroup) {
+ for (final ClusterSingletonServiceRegistration reg : serviceGroup) {
+ final ClusterSingletonService service = reg.getInstance();
final ListenableFuture<?> future;
-
try {
future = service.closeServiceInstance();
} catch (Exception e) {
GenericEntityOwnershipListener<TestInstanceIdentifier,
GenericEntityOwnershipChange<TestInstanceIdentifier, TestEntity>>>> singletonServiceGroup;
+ private ClusterSingletonServiceRegistration firstReg;
+ private ClusterSingletonServiceRegistration secondReg;
+
/**
* Initialization functionality for every Tests in this suite.
*
doReturn(SERVICE_GROUP_IDENT).when(mockClusterSingletonService).getIdentifier();
doReturn(SERVICE_GROUP_IDENT).when(mockClusterSingletonServiceSecond).getIdentifier();
+ firstReg = new AbstractClusterSingletonServiceRegistration(mockClusterSingletonService) {
+ @Override
+ protected void removeRegistration() {
+ // No-op
+ }
+ };
+ secondReg = new AbstractClusterSingletonServiceRegistration(mockClusterSingletonServiceSecond) {
+ @Override
+ protected void removeRegistration() {
+ // No-op
+ }
+ };
+
singletonServiceGroup = new ClusterSingletonServiceGroupImpl<>(SERVICE_IDENTIFIER, MAIN_ENTITY, CLOSE_ENTITY,
mockEosService);
}
public void initializationSlaveTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToSlave());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService, never()).registerCandidate(CLOSE_ENTITY);
public void initializationNoMasterTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToSlaveNoMaster());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService, never()).registerCandidate(CLOSE_ENTITY);
public void initializationInJeopardyTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToJeopardy());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService, never()).registerCandidate(CLOSE_ENTITY);
public void serviceRegistrationClusterSingletonServiceGroupTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
}
/**
throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
- singletonServiceGroup.registerService(mockClusterSingletonServiceSecond);
+ singletonServiceGroup.registerService(firstReg);
+ singletonServiceGroup.registerService(secondReg);
}
/**
public void serviceUnregistrationClusterSingletonServiceGroupTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
- assertTrue(singletonServiceGroup.unregisterService(mockClusterSingletonService));
+ singletonServiceGroup.registerService(firstReg);
+ assertTrue(singletonServiceGroup.unregisterService(firstReg));
verify(mockClusterSingletonService, never()).closeServiceInstance();
}
throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
- singletonServiceGroup.registerService(mockClusterSingletonServiceSecond);
- assertFalse(singletonServiceGroup.unregisterService(mockClusterSingletonService));
+ singletonServiceGroup.registerService(firstReg);
+ singletonServiceGroup.registerService(secondReg);
+ assertFalse(singletonServiceGroup.unregisterService(firstReg));
verify(mockClusterSingletonService, never()).closeServiceInstance();
}
public void getSlaveClusterSingletonServiceGroupTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToSlave());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
}
public void tryToTakeLeaderClusterSingletonServiceGroupTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToMaster());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService).registerCandidate(CLOSE_ENTITY);
public void takeMasterClusterSingletonServiceGroupTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToMaster());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService).registerCandidate(CLOSE_ENTITY);
public void waitToTakeMasterClusterSingletonServiceGroupTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToMaster());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService).registerCandidate(CLOSE_ENTITY);
public void inJeopardyInWaitPhaseClusterSingletonServiceGroupTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToMaster());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService).registerCandidate(CLOSE_ENTITY);
throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
- singletonServiceGroup.registerService(mockClusterSingletonServiceSecond);
+ singletonServiceGroup.registerService(firstReg);
+ singletonServiceGroup.registerService(secondReg);
singletonServiceGroup.ownershipChanged(getEntityToMaster());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService).registerCandidate(CLOSE_ENTITY);
public void inJeopardyLeaderClusterSingletonServiceGroupTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToMaster());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService).registerCandidate(CLOSE_ENTITY);
public void lostLeaderClusterSingletonServiceGroupTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToMaster());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService).registerCandidate(CLOSE_ENTITY);
*/
@Test(expected = RuntimeException.class)
public void tryToTakeLeaderForNotInitializedGroupTest() {
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
}
/**
public void checkClosingRegistrationTest() throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToMaster());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService).registerCandidate(CLOSE_ENTITY);
singletonServiceGroup.ownershipChanged(getDoubleEntityToMaster());
verify(mockClusterSingletonService).instantiateServiceInstance();
- assertTrue(singletonServiceGroup.unregisterService(mockClusterSingletonService));
+ assertTrue(singletonServiceGroup.unregisterService(firstReg));
verify(mockClusterSingletonService, never()).closeServiceInstance();
singletonServiceGroup.ownershipChanged(getEntityToSlaveNoMaster());
verify(mockClusterSingletonService).closeServiceInstance();
throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToMaster());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService).registerCandidate(CLOSE_ENTITY);
throws CandidateAlreadyRegisteredException {
singletonServiceGroup.initialize();
verify(mockEosService).registerCandidate(MAIN_ENTITY);
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToSlave());
verify(mockClusterSingletonService, never()).instantiateServiceInstance();
verify(mockEosService, never()).registerCandidate(CLOSE_ENTITY);
ExecutionException {
initializeGroupAndStartService();
- assertTrue(singletonServiceGroup.unregisterService(mockClusterSingletonService));
+ assertTrue(singletonServiceGroup.unregisterService(firstReg));
verify(mockClusterSingletonService, never()).closeServiceInstance();
verify(mockEntityCandReg, never()).close();
private void initializeGroupAndStartService() throws CandidateAlreadyRegisteredException {
initialize();
- singletonServiceGroup.registerService(mockClusterSingletonService);
+ singletonServiceGroup.registerService(firstReg);
singletonServiceGroup.ownershipChanged(getEntityToMaster());
verify(mockEosService).registerCandidate(CLOSE_ENTITY);
singletonServiceGroup.ownershipChanged(getDoubleEntityToMaster());