diff --git a/server/src/internalClusterTest/java/org/opensearch/ratelimitting/admissioncontrol/SimpleEnableAdmissionControlIT.java b/server/src/internalClusterTest/java/org/opensearch/ratelimitting/admissioncontrol/SimpleEnableAdmissionControlIT.java deleted file mode 100644 index cb4aa8d344a6e..0000000000000 --- a/server/src/internalClusterTest/java/org/opensearch/ratelimitting/admissioncontrol/SimpleEnableAdmissionControlIT.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - */ - -package org.opensearch.ratelimitting.admissioncontrol; - -import org.opensearch.action.admin.cluster.settings.ClusterUpdateSettingsRequest; -import org.opensearch.action.admin.indices.stats.IndicesStatsResponse; -import org.opensearch.action.admin.indices.stats.ShardStats; -import org.opensearch.action.bulk.BulkRequest; -import org.opensearch.action.bulk.BulkResponse; -import org.opensearch.action.index.IndexRequest; -import org.opensearch.cluster.metadata.IndexMetadata; -import org.opensearch.cluster.node.DiscoveryNodes; -import org.opensearch.cluster.routing.ShardRouting; -import org.opensearch.common.UUIDs; -import org.opensearch.common.action.ActionFuture; -import org.opensearch.common.collect.Tuple; -import org.opensearch.common.settings.Settings; -import org.opensearch.ratelimitting.admissioncontrol.settings.CPUBasedAdmissionControllerSettings; -import org.opensearch.test.OpenSearchIntegTestCase; - -import java.util.Collections; -import java.util.stream.Stream; - -import static org.opensearch.test.hamcrest.OpenSearchAssertions.assertAcked; - -@OpenSearchIntegTestCase.ClusterScope(scope = OpenSearchIntegTestCase.Scope.TEST, numDataNodes = 2, numClientNodes = 1) -public class SimpleEnableAdmissionControlIT extends OpenSearchIntegTestCase { - - public static final Settings settings = Settings.builder() - .put(AdmissionControlSettings.ADMISSION_CONTROL_TRANSPORT_LAYER_MODE.getKey(), "enforced") - .put(CPUBasedAdmissionControllerSettings.CPU_BASED_ADMISSION_CONTROLLER_TRANSPORT_LAYER_MODE.getKey(), "enforced") - .build(); - - public static final String INDEX_NAME = "test_index"; - - @Override - protected Settings nodeSettings(int nodeOrdinal) { - return Settings.builder().put(super.nodeSettings(nodeOrdinal)).put(settings).build(); - } - - // TODO this integration test currently evaluating is admissionControl Interceptor is triggering as expected - // and registered controllers are applying for the requests or not. Will modify this in further PR's. - public void testAdmissionControlRejectionFlow() { - assertAcked( - prepareCreate( - INDEX_NAME, - Settings.builder().put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, 1).put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 1) - ) - ); - ensureGreen(INDEX_NAME); - - Tuple primaryReplicaNodeNames = getPrimaryReplicaNodeNames(INDEX_NAME); - String primaryName = primaryReplicaNodeNames.v1(); - String replicaName = primaryReplicaNodeNames.v2(); - String coordinatingOnlyNode = getCoordinatingOnlyNode(); - - AdmissionControlService admissionControlServicePrimary = internalCluster().getInstance(AdmissionControlService.class, primaryName); - AdmissionControlService admissionControlServiceReplica = internalCluster().getInstance(AdmissionControlService.class, replicaName); - final BulkRequest bulkRequest = new BulkRequest(); - for (int i = 0; i < 3; ++i) { - IndexRequest request = new IndexRequest(INDEX_NAME).id(UUIDs.base64UUID()) - .source(Collections.singletonMap("key", randomAlphaOfLength(50))); - bulkRequest.add(request); - } - - // evaluating the admission control triggered or not - ActionFuture successFuture = client(coordinatingOnlyNode).bulk(bulkRequest); - successFuture.actionGet(); - assertEquals(admissionControlServicePrimary.getAdmissionControllers().size(), 1); - assertEquals(admissionControlServicePrimary.getAdmissionControllers().get(0).getRejectionCount(), 1); - assertEquals(admissionControlServiceReplica.getAdmissionControllers().size(), 1); - assertEquals(admissionControlServiceReplica.getAdmissionControllers().get(0).getRejectionCount(), 0); - - // evaluating the rejection to increment - successFuture = client(coordinatingOnlyNode).bulk(bulkRequest); - successFuture.actionGet(); - assertEquals(admissionControlServicePrimary.getAdmissionControllers().size(), 1); - assertEquals(admissionControlServicePrimary.getAdmissionControllers().get(0).getRejectionCount(), 2); - assertEquals(admissionControlServiceReplica.getAdmissionControllers().size(), 1); - assertEquals(admissionControlServiceReplica.getAdmissionControllers().get(0).getRejectionCount(), 0); - - // evaluating the rejection count if the admission controller disabled - ClusterUpdateSettingsRequest updateSettingsRequest = new ClusterUpdateSettingsRequest(); - updateSettingsRequest.transientSettings( - Settings.builder() - .put(CPUBasedAdmissionControllerSettings.CPU_BASED_ADMISSION_CONTROLLER_TRANSPORT_LAYER_MODE.getKey(), "disabled") - ); - assertAcked(client().admin().cluster().updateSettings(updateSettingsRequest).actionGet()); - successFuture = client(coordinatingOnlyNode).bulk(bulkRequest); - successFuture.actionGet(); - assertEquals(admissionControlServicePrimary.getAdmissionControllers().size(), 1); - assertEquals(admissionControlServicePrimary.getAdmissionControllers().get(0).getRejectionCount(), 2); - assertEquals(admissionControlServiceReplica.getAdmissionControllers().size(), 1); - assertEquals(admissionControlServiceReplica.getAdmissionControllers().get(0).getRejectionCount(), 0); - - // evaluating the rejection count if the admission controller is dynamically enabled - updateSettingsRequest = new ClusterUpdateSettingsRequest(); - updateSettingsRequest.transientSettings( - Settings.builder() - .put(CPUBasedAdmissionControllerSettings.CPU_BASED_ADMISSION_CONTROLLER_TRANSPORT_LAYER_MODE.getKey(), "enforced") - ); - assertAcked(client().admin().cluster().updateSettings(updateSettingsRequest).actionGet()); - - successFuture = client(coordinatingOnlyNode).bulk(bulkRequest); - successFuture.actionGet(); - - assertEquals(admissionControlServicePrimary.getAdmissionControllers().size(), 1); - assertEquals(admissionControlServicePrimary.getAdmissionControllers().get(0).getRejectionCount(), 3); - assertEquals(admissionControlServiceReplica.getAdmissionControllers().size(), 1); - assertEquals(admissionControlServiceReplica.getAdmissionControllers().get(0).getRejectionCount(), 0); - } - - private Tuple getPrimaryReplicaNodeNames(String indexName) { - IndicesStatsResponse response = client().admin().indices().prepareStats(indexName).get(); - String primaryId = Stream.of(response.getShards()) - .map(ShardStats::getShardRouting) - .filter(ShardRouting::primary) - .findAny() - .get() - .currentNodeId(); - String replicaId = Stream.of(response.getShards()) - .map(ShardStats::getShardRouting) - .filter(sr -> sr.primary() == false) - .findAny() - .get() - .currentNodeId(); - DiscoveryNodes nodes = client().admin().cluster().prepareState().get().getState().nodes(); - String primaryName = nodes.get(primaryId).getName(); - String replicaName = nodes.get(replicaId).getName(); - return new Tuple<>(primaryName, replicaName); - } - - private String getCoordinatingOnlyNode() { - return client().admin() - .cluster() - .prepareState() - .get() - .getState() - .nodes() - .getCoordinatingOnlyNodes() - .values() - .iterator() - .next() - .getName(); - } -} diff --git a/server/src/main/java/org/opensearch/common/network/NetworkModule.java b/server/src/main/java/org/opensearch/common/network/NetworkModule.java index 6ea6ca1be571b..fe16867fca195 100644 --- a/server/src/main/java/org/opensearch/common/network/NetworkModule.java +++ b/server/src/main/java/org/opensearch/common/network/NetworkModule.java @@ -61,7 +61,6 @@ import org.opensearch.threadpool.ThreadPool; import org.opensearch.transport.Transport; import org.opensearch.transport.TransportInterceptor; -import org.opensearch.transport.TransportInterceptorRegistry; import org.opensearch.transport.TransportRequest; import org.opensearch.transport.TransportRequestHandler; @@ -150,15 +149,9 @@ public NetworkModule( NetworkService networkService, HttpServerTransport.Dispatcher dispatcher, ClusterSettings clusterSettings, - Tracer tracer, - TransportInterceptorRegistry transportInterceptorRegistry + Tracer tracer ) { this.settings = settings; - // Adding core interceptors first and other plugin interceptor will follow - List coreTransportInterceptors = transportInterceptorRegistry.getTransportInterceptors(); - for (TransportInterceptor interceptor : coreTransportInterceptors) { - registerTransportInterceptor(interceptor); - } for (NetworkPlugin plugin : plugins) { Map> httpTransportFactory = plugin.getHttpTransports( settings, @@ -274,6 +267,14 @@ private void registerTransportInterceptor(TransportInterceptor interceptor) { this.transportInterceptors.add(Objects.requireNonNull(interceptor, "interceptor must not be null")); } + /** + * Registers a new {@link TransportInterceptor} + * This method used to register CoreInterceptors before the plugin interceptors + */ + public void registerCoreTransportInterceptor(TransportInterceptor interceptor) { + this.transportInterceptors.add(0, Objects.requireNonNull(interceptor, "interceptor must not be null")); + } + /** * Returns a composite {@link TransportInterceptor} containing all registered interceptors * @see #registerTransportInterceptor(TransportInterceptor) diff --git a/server/src/main/java/org/opensearch/node/Node.java b/server/src/main/java/org/opensearch/node/Node.java index 3bd671250ddd1..b22d912b471ed 100644 --- a/server/src/main/java/org/opensearch/node/Node.java +++ b/server/src/main/java/org/opensearch/node/Node.java @@ -239,7 +239,6 @@ import org.opensearch.transport.RemoteClusterService; import org.opensearch.transport.Transport; import org.opensearch.transport.TransportInterceptor; -import org.opensearch.transport.TransportInterceptorRegistry; import org.opensearch.transport.TransportService; import org.opensearch.usage.UsageService; import org.opensearch.watcher.ResourceWatcherService; @@ -822,18 +821,6 @@ protected Node( remoteStoreStatsTrackerFactory, recoverySettings ); - TransportInterceptorRegistry transportInterceptorRegistry = new TransportInterceptorRegistry(); - - final AdmissionControlService admissionControlService = new AdmissionControlService( - settings, - clusterService.getClusterSettings(), - threadPool - ); - - AdmissionControlTransportInterceptor admissionControlTransportInterceptor = new AdmissionControlTransportInterceptor( - admissionControlService - ); - transportInterceptorRegistry.addTransportInterceptor(admissionControlTransportInterceptor); final AliasValidator aliasValidator = new AliasValidator(); @@ -906,6 +893,16 @@ protected Node( final RestController restController = actionModule.getRestController(); + final AdmissionControlService admissionControlService = new AdmissionControlService( + settings, + clusterService.getClusterSettings(), + threadPool + ); + + AdmissionControlTransportInterceptor admissionControlTransportInterceptor = new AdmissionControlTransportInterceptor( + admissionControlService + ); + final NetworkModule networkModule = new NetworkModule( settings, pluginsService.filterPlugins(NetworkPlugin.class), @@ -918,9 +915,10 @@ protected Node( networkService, restController, clusterService.getClusterSettings(), - tracer, - transportInterceptorRegistry + tracer ); + networkModule.registerCoreTransportInterceptor(admissionControlTransportInterceptor); + Collection>> indexTemplateMetadataUpgraders = pluginsService.filterPlugins( Plugin.class ).stream().map(Plugin::getIndexTemplateMetadataUpgrader).collect(Collectors.toList()); diff --git a/server/src/main/java/org/opensearch/transport/TransportInterceptorRegistry.java b/server/src/main/java/org/opensearch/transport/TransportInterceptorRegistry.java deleted file mode 100644 index 05070d9186b85..0000000000000 --- a/server/src/main/java/org/opensearch/transport/TransportInterceptorRegistry.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - */ - -package org.opensearch.transport; - -import java.util.ArrayList; -import java.util.List; - -/** - * Class to register transport interceptors - */ -public class TransportInterceptorRegistry { - - /** - * List of the transport interceptors - */ - List transportInterceptors; - - public TransportInterceptorRegistry() { - this.transportInterceptors = new ArrayList<>(); - } - - /** - * - * @param transportInterceptor new transport interceptor object - */ - public void addTransportInterceptor(TransportInterceptor transportInterceptor) { - this.transportInterceptors.add(transportInterceptor); - } - - /** - * - * @return list of all transport interceptors - */ - public List getTransportInterceptors() { - return this.transportInterceptors; - } -} diff --git a/server/src/test/java/org/opensearch/common/network/NetworkModuleTests.java b/server/src/test/java/org/opensearch/common/network/NetworkModuleTests.java index 326192db71de7..5f8595d0fb086 100644 --- a/server/src/test/java/org/opensearch/common/network/NetworkModuleTests.java +++ b/server/src/test/java/org/opensearch/common/network/NetworkModuleTests.java @@ -54,7 +54,6 @@ import org.opensearch.threadpool.ThreadPool; import org.opensearch.transport.Transport; import org.opensearch.transport.TransportInterceptor; -import org.opensearch.transport.TransportInterceptorRegistry; import org.opensearch.transport.TransportRequest; import org.opensearch.transport.TransportRequestHandler; @@ -111,7 +110,6 @@ public HttpStats stats() { public void testRegisterTransport() { Settings settings = Settings.builder().put(NetworkModule.TRANSPORT_TYPE_KEY, "custom").build(); Supplier custom = () -> null; // content doesn't matter we check reference equality - TransportInterceptorRegistry transportInterceptorRegistry = new TransportInterceptorRegistry(); NetworkPlugin plugin = new NetworkPlugin() { @Override public Map> getTransports( @@ -126,7 +124,7 @@ public Map> getTransports( return Collections.singletonMap("custom", custom); } }; - NetworkModule module = newNetworkModule(settings, transportInterceptorRegistry, plugin); + NetworkModule module = newNetworkModule(settings, plugin); assertSame(custom, module.getTransportSupplier()); } @@ -136,9 +134,8 @@ public void testRegisterHttpTransport() { .put(NetworkModule.TRANSPORT_TYPE_KEY, "local") .build(); Supplier custom = FakeHttpTransport::new; - TransportInterceptorRegistry transportInterceptorRegistry = new TransportInterceptorRegistry(); - NetworkModule module = newNetworkModule(settings, transportInterceptorRegistry, new NetworkPlugin() { + NetworkModule module = newNetworkModule(settings, new NetworkPlugin() { @Override public Map> getHttpTransports( Settings settings, @@ -158,7 +155,7 @@ public Map> getHttpTransports( assertSame(custom, module.getHttpServerTransportSupplier()); settings = Settings.builder().put(NetworkModule.TRANSPORT_TYPE_KEY, "local").build(); - NetworkModule newModule = newNetworkModule(settings, transportInterceptorRegistry); + NetworkModule newModule = newNetworkModule(settings); expectThrows(IllegalStateException.class, () -> newModule.getHttpServerTransportSupplier()); } @@ -172,8 +169,7 @@ public void testOverrideDefault() { Supplier customTransport = () -> null; // content doesn't matter we check reference equality Supplier custom = FakeHttpTransport::new; Supplier def = FakeHttpTransport::new; - TransportInterceptorRegistry transportInterceptorRegistry = new TransportInterceptorRegistry(); - NetworkModule module = newNetworkModule(settings, transportInterceptorRegistry, new NetworkPlugin() { + NetworkModule module = newNetworkModule(settings, new NetworkPlugin() { @Override public Map> getTransports( Settings settings, @@ -218,8 +214,7 @@ public void testDefaultKeys() { Supplier custom = FakeHttpTransport::new; Supplier def = FakeHttpTransport::new; Supplier customTransport = () -> null; - TransportInterceptorRegistry transportInterceptorRegistry = new TransportInterceptorRegistry(); - NetworkModule module = newNetworkModule(settings, transportInterceptorRegistry, new NetworkPlugin() { + NetworkModule module = newNetworkModule(settings, new NetworkPlugin() { @Override public Map> getTransports( Settings settings, @@ -260,7 +255,6 @@ public Map> getHttpTransports( public void testRegisterInterceptor() { Settings settings = Settings.builder().put(NetworkModule.TRANSPORT_TYPE_KEY, "local").build(); AtomicInteger called = new AtomicInteger(0); - TransportInterceptorRegistry transportInterceptorRegistry = new TransportInterceptorRegistry(); TransportInterceptor interceptor = new TransportInterceptor() { @Override @@ -279,7 +273,7 @@ public TransportRequestHandler interceptHandler( return actualHandler; } }; - NetworkModule module = newNetworkModule(settings, transportInterceptorRegistry, new NetworkPlugin() { + NetworkModule module = newNetworkModule(settings, new NetworkPlugin() { @Override public List getTransportInterceptors( NamedWriteableRegistry namedWriteableRegistry, @@ -301,7 +295,7 @@ public List getTransportInterceptors( assertSame(((NetworkModule.CompositeTransportInterceptor) transportInterceptor).transportInterceptors.get(0), interceptor); NullPointerException nullPointerException = expectThrows(NullPointerException.class, () -> { - newNetworkModule(settings, transportInterceptorRegistry, new NetworkPlugin() { + newNetworkModule(settings, new NetworkPlugin() { @Override public List getTransportInterceptors( NamedWriteableRegistry namedWriteableRegistry, @@ -318,7 +312,6 @@ public List getTransportInterceptors( public void testRegisterCoreInterceptor() { Settings settings = Settings.builder().put(NetworkModule.TRANSPORT_TYPE_KEY, "local").build(); AtomicInteger called = new AtomicInteger(0); - TransportInterceptorRegistry transportInterceptorRegistry = new TransportInterceptorRegistry(); TransportInterceptor interceptor = new TransportInterceptor() { @Override @@ -337,8 +330,9 @@ public TransportRequestHandler interceptHandler( return actualHandler; } }; - transportInterceptorRegistry.addTransportInterceptor(interceptor); - NetworkModule module = newNetworkModule(settings, transportInterceptorRegistry); + + NetworkModule module = newNetworkModule(settings); + module.registerCoreTransportInterceptor(interceptor); TransportInterceptor transportInterceptor = module.getTransportInterceptor(); assertEquals(0, called.get()); @@ -349,20 +343,77 @@ public TransportRequestHandler interceptHandler( assertTrue(transportInterceptor instanceof NetworkModule.CompositeTransportInterceptor); assertEquals(((NetworkModule.CompositeTransportInterceptor) transportInterceptor).transportInterceptors.size(), 1); assertSame(((NetworkModule.CompositeTransportInterceptor) transportInterceptor).transportInterceptors.get(0), interceptor); + } - TransportInterceptorRegistry finalTransportInterceptorRegistry = new TransportInterceptorRegistry(); - finalTransportInterceptorRegistry.addTransportInterceptor(null); - NullPointerException nullPointerException = expectThrows(NullPointerException.class, () -> { - newNetworkModule(settings, finalTransportInterceptorRegistry); + public void testInterceptorOrder() { + Settings settings = Settings.builder().put(NetworkModule.TRANSPORT_TYPE_KEY, "local").build(); + AtomicInteger called = new AtomicInteger(0); + + TransportInterceptor interceptor = new TransportInterceptor() { + @Override + public TransportRequestHandler interceptHandler( + String action, + String executor, + boolean forceExecution, + TransportRequestHandler actualHandler + ) { + called.incrementAndGet(); + if ("foo/bar/boom".equals(action)) { + assertTrue(forceExecution); + } else { + assertFalse(forceExecution); + } + return actualHandler; + } + }; + + NetworkModule module = newNetworkModule(settings, new NetworkPlugin() { + @Override + public List getTransportInterceptors( + NamedWriteableRegistry namedWriteableRegistry, + ThreadContext threadContext + ) { + assertNotNull(threadContext); + return Collections.singletonList(interceptor); + } }); - assertEquals("interceptor must not be null", nullPointerException.getMessage()); + + AtomicInteger called1 = new AtomicInteger(0); + + TransportInterceptor interceptor1 = new TransportInterceptor() { + @Override + public TransportRequestHandler interceptHandler( + String action, + String executor, + boolean forceExecution, + TransportRequestHandler actualHandler + ) { + called1.incrementAndGet(); + if ("foo/bar/boom".equals(action)) { + assertTrue(forceExecution); + } else { + assertFalse(forceExecution); + } + return actualHandler; + } + }; + + module.registerCoreTransportInterceptor(interceptor1); + + TransportInterceptor transportInterceptor = module.getTransportInterceptor(); + assertEquals(((NetworkModule.CompositeTransportInterceptor) transportInterceptor).transportInterceptors.size(), 2); + + assertEquals(0, called.get()); + assertEquals(0, called1.get()); + transportInterceptor.interceptHandler("foo/bar/boom", null, true, null); + assertEquals(1, called.get()); + assertEquals(1, called1.get()); + transportInterceptor.interceptHandler("foo/baz/boom", null, false, null); + assertEquals(2, called.get()); + assertEquals(2, called1.get()); } - private NetworkModule newNetworkModule( - Settings settings, - TransportInterceptorRegistry transportInterceptorRegistry, - NetworkPlugin... plugins - ) { + private NetworkModule newNetworkModule(Settings settings, NetworkPlugin... plugins) { return new NetworkModule( settings, Arrays.asList(plugins), @@ -375,8 +426,7 @@ private NetworkModule newNetworkModule( null, new NullDispatcher(), new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS), - NoopTracer.INSTANCE, - transportInterceptorRegistry + NoopTracer.INSTANCE ); } } diff --git a/server/src/test/java/org/opensearch/transport/TransportInterceptorRegistryTests.java b/server/src/test/java/org/opensearch/transport/TransportInterceptorRegistryTests.java deleted file mode 100644 index c0942f8f740c0..0000000000000 --- a/server/src/test/java/org/opensearch/transport/TransportInterceptorRegistryTests.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - */ - -package org.opensearch.transport; - -import org.opensearch.test.OpenSearchTestCase; - -import java.util.ArrayList; - -import static org.mockito.Mockito.mock; - -public class TransportInterceptorRegistryTests extends OpenSearchTestCase { - - private TransportInterceptorRegistry transportInterceptorRegistry; - - @Override - public void setUp() throws Exception { - super.setUp(); - transportInterceptorRegistry = new TransportInterceptorRegistry(); - } - - @Override - public void tearDown() throws Exception { - super.tearDown(); - } - - public void testDefaultSettings() { - assertEquals(transportInterceptorRegistry.transportInterceptors, new ArrayList<>()); - assertEquals(transportInterceptorRegistry.getTransportInterceptors().size(), 0); - } - - public void testRegisterInterceptor() { - transportInterceptorRegistry.addTransportInterceptor(mock(TransportInterceptor.class)); - assertEquals(transportInterceptorRegistry.getTransportInterceptors().size(), 1); - transportInterceptorRegistry.addTransportInterceptor(mock(TransportInterceptor.class)); - assertEquals(transportInterceptorRegistry.getTransportInterceptors().size(), 2); - } - - public void testGetAllInterceptor() { - transportInterceptorRegistry.addTransportInterceptor(mock(TransportInterceptor.class)); - assertEquals(transportInterceptorRegistry.getTransportInterceptors().size(), 1); - transportInterceptorRegistry.addTransportInterceptor(mock(TransportInterceptor.class)); - assertEquals(transportInterceptorRegistry.getTransportInterceptors().size(), 2); - transportInterceptorRegistry.getTransportInterceptors().forEach(transportInterceptor -> { - assertEquals(transportInterceptor.getClass(), mock(TransportInterceptor.class).getClass()); - }); - } -}