From d357d50baf588218ed755be73f28892129ed2601 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 4 Oct 2021 10:12:30 +0200 Subject: [PATCH] Migrate rpcbenchmark to OSGi DS Ditch blueprint and use turn NtfBenchmarkProvider into a simple component. Requires some amount of refactoring. JIRA: CONTROLLER-2001 Change-Id: Ib8db52d91013fe1ae13c55b5537b743f8ccbf320 Signed-off-by: Robert Varga --- benchmark/rpcbenchmark/pom.xml | 14 +++++ .../impl/AbstractRpcbenchPayloadService.java | 39 ++++++++++++ .../impl/GlobalBindingRTCServer.java | 43 ++++--------- .../impl/RoutedBindingRTCServer.java | 27 ++++++++ .../impl/RoutedBindingRTClient.java | 9 +-- .../impl/RpcbenchmarkProvider.java | 63 +++++++++++-------- .../OSGI-INF/blueprint/rpcbenchmark.xml | 27 -------- 7 files changed, 129 insertions(+), 93 deletions(-) create mode 100644 benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/AbstractRpcbenchPayloadService.java create mode 100644 benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RoutedBindingRTCServer.java delete mode 100644 benchmark/rpcbenchmark/src/main/resources/OSGI-INF/blueprint/rpcbenchmark.xml diff --git a/benchmark/rpcbenchmark/pom.xml b/benchmark/rpcbenchmark/pom.xml index 978e13ec28..4ee911474c 100644 --- a/benchmark/rpcbenchmark/pom.xml +++ b/benchmark/rpcbenchmark/pom.xml @@ -28,5 +28,19 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.opendaylight.mdsal mdsal-binding-api + + org.osgi + org.osgi.service.component.annotations + + + com.guicedee.services + javax.inject + true + + + javax.annotation + javax.annotation-api + true + diff --git a/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/AbstractRpcbenchPayloadService.java b/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/AbstractRpcbenchPayloadService.java new file mode 100644 index 0000000000..33328f9664 --- /dev/null +++ b/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/AbstractRpcbenchPayloadService.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015 Cisco Systems and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package rpcbenchmark.impl; + +import com.google.common.util.concurrent.ListenableFuture; +import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.GlobalRpcBenchInput; +import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.GlobalRpcBenchOutput; +import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.GlobalRpcBenchOutputBuilder; +import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RoutedRpcBenchInput; +import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RoutedRpcBenchOutput; +import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RoutedRpcBenchOutputBuilder; +import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RpcbenchPayloadService; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; + +abstract class AbstractRpcbenchPayloadService implements RpcbenchPayloadService { + private int numRpcs = 0; + + @Override + public final ListenableFuture> globalRpcBench(final GlobalRpcBenchInput input) { + numRpcs++; + return RpcResultBuilder.success(new GlobalRpcBenchOutputBuilder(input).build()).buildFuture(); + } + + @Override + public final ListenableFuture> routedRpcBench(final RoutedRpcBenchInput input) { + numRpcs++; + return RpcResultBuilder.success(new RoutedRpcBenchOutputBuilder(input).build()).buildFuture(); + } + + final int getNumRpcs() { + return numRpcs; + } +} diff --git a/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/GlobalBindingRTCServer.java b/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/GlobalBindingRTCServer.java index edded6a835..67fde76865 100644 --- a/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/GlobalBindingRTCServer.java +++ b/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/GlobalBindingRTCServer.java @@ -5,49 +5,28 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package rpcbenchmark.impl; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.GlobalRpcBenchInput; -import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.GlobalRpcBenchOutput; -import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.GlobalRpcBenchOutputBuilder; -import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RoutedRpcBenchInput; -import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RoutedRpcBenchOutput; -import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RoutedRpcBenchOutputBuilder; +import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RpcbenchPayloadService; -import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; +import org.opendaylight.yangtools.concepts.Registration; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GlobalBindingRTCServer implements RpcbenchPayloadService { - +final class GlobalBindingRTCServer extends AbstractRpcbenchPayloadService implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(GlobalBindingRTCServer.class); - private int numRpcs = 0; - public GlobalBindingRTCServer() { - LOG.debug("GlobalBindingRTCServer created."); - } + private final Registration reg; - @Override - public ListenableFuture> globalRpcBench(final GlobalRpcBenchInput input) { - GlobalRpcBenchOutput output = new GlobalRpcBenchOutputBuilder(input).build(); - RpcResult result = RpcResultBuilder.success(output).build(); - numRpcs++; - return Futures.immediateFuture(result); + GlobalBindingRTCServer(@Reference final RpcProviderService rpcProvider) { + reg = rpcProvider.registerRpcImplementation(RpcbenchPayloadService.class, this); + LOG.debug("GlobalBindingRTCServer started"); } @Override - public ListenableFuture> routedRpcBench(final RoutedRpcBenchInput input) { - RoutedRpcBenchOutput output = new RoutedRpcBenchOutputBuilder(input).build(); - RpcResult result = RpcResultBuilder.success(output).build(); - numRpcs++; - return Futures.immediateFuture(result); - } - - public int getNumRpcs() { - return numRpcs; + public void close() { + reg.close(); + LOG.debug("GlobalBindingRTCServer stopped"); } } diff --git a/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RoutedBindingRTCServer.java b/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RoutedBindingRTCServer.java new file mode 100644 index 0000000000..1982bebcd8 --- /dev/null +++ b/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RoutedBindingRTCServer.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015 Cisco Systems and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package rpcbenchmark.impl; + +import java.util.Set; +import org.opendaylight.mdsal.binding.api.RpcProviderService; +import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RpcbenchPayloadService; +import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +final class RoutedBindingRTCServer extends AbstractRpcbenchPayloadService implements AutoCloseable { + private final Registration reg; + + RoutedBindingRTCServer(final RpcProviderService rpcProvider, final Set> paths) { + reg = rpcProvider.registerRpcImplementation(RpcbenchPayloadService.class, this, paths); + } + + @Override + public void close() { + reg.close(); + } +} diff --git a/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RoutedBindingRTClient.java b/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RoutedBindingRTClient.java index a7cb4bf30c..d2c3ae339d 100644 --- a/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RoutedBindingRTClient.java +++ b/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RoutedBindingRTClient.java @@ -34,18 +34,13 @@ public class RoutedBindingRTClient implements RTCClient { private final RpcbenchPayloadService service; private final AtomicLong rpcOk = new AtomicLong(0); private final AtomicLong rpcError = new AtomicLong(0); - private final List inVal; + private final List inVal = new ArrayList<>(); private final int inSize; public RoutedBindingRTClient(final RpcConsumerRegistry registry, final int inSize, final List> routeIid) { - if (registry != null) { - this.service = registry.getRpcService(RpcbenchPayloadService.class); - } else { - this.service = null; - } + service = registry.getRpcService(RpcbenchPayloadService.class); this.inSize = inSize; - this.inVal = new ArrayList<>(); Builder listVals = ImmutableMap.builderWithExpectedSize(inSize); for (int i = 0; i < inSize; i++) { diff --git a/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RpcbenchmarkProvider.java b/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RpcbenchmarkProvider.java index 0c9a54b8e9..306539ce66 100644 --- a/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RpcbenchmarkProvider.java +++ b/benchmark/rpcbenchmark/src/main/java/rpcbenchmark/impl/RpcbenchmarkProvider.java @@ -8,6 +8,7 @@ package rpcbenchmark.impl; import static com.google.common.base.Verify.verifyNotNull; +import static java.util.Objects.requireNonNull; import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; @@ -17,9 +18,11 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; +import javax.annotation.PreDestroy; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; import org.opendaylight.mdsal.binding.api.RpcProviderService; -import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RpcbenchPayloadService; import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.RpcbenchRpcRoutes; import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.rpcbench.rpc.routes.RpcRoute; import org.opendaylight.yang.gen.v1.rpcbench.payload.rev150702.rpcbench.rpc.routes.RpcRouteKey; @@ -31,38 +34,49 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rpcbench import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rpcbenchmark.rev150702.TestStatusOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rpcbenchmark.rev150702.TestStatusOutput.ExecStatus; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rpcbenchmark.rev150702.TestStatusOutputBuilder; -import org.opendaylight.yangtools.concepts.ObjectRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.common.Uint32; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.RequireServiceComponentRuntime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class RpcbenchmarkProvider implements AutoCloseable, RpcbenchmarkService { - +@Singleton +@Component(service = {}) +@RequireServiceComponentRuntime +public final class RpcbenchmarkProvider implements AutoCloseable, RpcbenchmarkService { private static final Logger LOG = LoggerFactory.getLogger(RpcbenchmarkProvider.class); private static final int TEST_TIMEOUT = 5; - private final GlobalBindingRTCServer globalServer; private final AtomicReference execStatus = new AtomicReference<>(ExecStatus.Idle); private final RpcProviderService providerRegistry; private final RpcConsumerRegistry consumerRegistry; - - public RpcbenchmarkProvider(final RpcProviderService providerRegistry, final RpcConsumerRegistry consumerRegistry, - final GlobalBindingRTCServer globalServer) { - this.providerRegistry = providerRegistry; - this.consumerRegistry = consumerRegistry; - this.globalServer = globalServer; - } - - public void init() { + private final GlobalBindingRTCServer globalServer; + private final Registration reg; + + @Inject + @Activate + public RpcbenchmarkProvider(@Reference final RpcProviderService providerRegistry, + @Reference final RpcConsumerRegistry consumerRegistry) { + this.providerRegistry = requireNonNull(providerRegistry); + this.consumerRegistry = requireNonNull(consumerRegistry); + globalServer = new GlobalBindingRTCServer(providerRegistry); + reg = providerRegistry.registerRpcImplementation(RpcbenchmarkService.class, this); LOG.info("RpcbenchmarkProvider initiated"); } @Override + @Deactivate + @PreDestroy public void close() { + globalServer.close(); + reg.close(); LOG.info("RpcbenchmarkProvider closed"); } @@ -71,24 +85,17 @@ public class RpcbenchmarkProvider implements AutoCloseable, RpcbenchmarkService LOG.debug("startTest {}", input); final RTCClient client; - final List> rpcRegs = new ArrayList<>(); + RoutedBindingRTCServer routed = null; switch (input.getOperation()) { case ROUTEDRTC: List> routeIid = new ArrayList<>(); for (int i = 0; i < input.getNumServers().intValue(); i++) { - GlobalBindingRTCServer server = new GlobalBindingRTCServer(); - KeyedInstanceIdentifier iid = - InstanceIdentifier.create(RpcbenchRpcRoutes.class) - .child(RpcRoute.class, new RpcRouteKey(Integer.toString(i))); - routeIid.add(iid); - - ObjectRegistration routedReg = providerRegistry.registerRpcImplementation( - RpcbenchPayloadService.class, server, Set.of(iid)); - - rpcRegs.add(routedReg); + routeIid.add(InstanceIdentifier.create(RpcbenchRpcRoutes.class) + .child(RpcRoute.class, new RpcRouteKey(Integer.toString(i)))); } + routed = new RoutedBindingRTCServer(providerRegistry, Set.copyOf(routeIid)); client = new RoutedBindingRTClient(consumerRegistry, input.getPayloadSize().intValue(), routeIid); break; @@ -136,7 +143,9 @@ public class RpcbenchmarkProvider implements AutoCloseable, RpcbenchmarkService .build(); return RpcResultBuilder.success(output).buildFuture(); } finally { - rpcRegs.forEach(ObjectRegistration::close); + if (routed != null) { + routed.close(); + } } } diff --git a/benchmark/rpcbenchmark/src/main/resources/OSGI-INF/blueprint/rpcbenchmark.xml b/benchmark/rpcbenchmark/src/main/resources/OSGI-INF/blueprint/rpcbenchmark.xml deleted file mode 100644 index 3c666e4c3f..0000000000 --- a/benchmark/rpcbenchmark/src/main/resources/OSGI-INF/blueprint/rpcbenchmark.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - -- 2.36.6