This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-19080 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit fd0bd3850ca68724bf5b86449b22bdadbd710cf1 Author: amashenkov <[email protected]> AuthorDate: Wed Mar 22 12:41:41 2023 +0300 WIP. Introduce StandaloneMetastorageManager for test purposes. --- modules/metastorage/build.gradle | 5 + .../metastorage/impl/MetaStorageManagerImpl.java | 2 +- .../impl/StandaloneMetastorageManager.java | 172 +++++++++++++++++++++ 3 files changed, 178 insertions(+), 1 deletion(-) diff --git a/modules/metastorage/build.gradle b/modules/metastorage/build.gradle index fb5bb8c596..3eb17438d7 100644 --- a/modules/metastorage/build.gradle +++ b/modules/metastorage/build.gradle @@ -57,9 +57,14 @@ dependencies { integrationTestImplementation testFixtures(project(':ignite-metastorage')) integrationTestImplementation testFixtures(project(':ignite-cluster-management')) + testFixturesImplementation project(':ignite-cluster-management') testFixturesImplementation project(':ignite-core') + testFixturesImplementation project(':ignite-raft-api') testFixturesImplementation project(':ignite-rocksdb-common') + testFixturesImplementation project(':ignite-vault') + testFixturesImplementation testFixtures(project(':ignite-vault')) testFixturesImplementation libs.jetbrains.annotations + testFixturesImplementation libs.mockito.core } description = 'ignite-metastorage' diff --git a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java index 23452efed6..ea8f5418f0 100644 --- a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java +++ b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java @@ -127,7 +127,7 @@ public class MetaStorageManagerImpl implements MetaStorageManager { this.storage = storage; } - private CompletableFuture<MetaStorageServiceImpl> initializeMetaStorage(Set<String> metaStorageNodes) { + protected CompletableFuture<MetaStorageServiceImpl> initializeMetaStorage(Set<String> metaStorageNodes) { ClusterNode thisNode = clusterService.topologyService().localMember(); String thisNodeName = thisNode.name(); diff --git a/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/impl/StandaloneMetastorageManager.java b/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/impl/StandaloneMetastorageManager.java new file mode 100644 index 0000000000..6adb379f50 --- /dev/null +++ b/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/impl/StandaloneMetastorageManager.java @@ -0,0 +1,172 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.metastorage.impl; + +import static java.util.Collections.singleton; +import static java.util.concurrent.CompletableFuture.completedFuture; +import static java.util.concurrent.CompletableFuture.failedFuture; + +import java.io.Serializable; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicReference; +import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManager; +import org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologyService; +import org.apache.ignite.internal.metastorage.MetaStorageManager; +import org.apache.ignite.internal.metastorage.server.KeyValueStorage; +import org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStorage; +import org.apache.ignite.internal.metastorage.server.raft.MetaStorageListener; +import org.apache.ignite.internal.raft.Command; +import org.apache.ignite.internal.raft.RaftManager; +import org.apache.ignite.internal.raft.ReadCommand; +import org.apache.ignite.internal.raft.WriteCommand; +import org.apache.ignite.internal.raft.service.CommandClosure; +import org.apache.ignite.internal.raft.service.RaftGroupService; +import org.apache.ignite.internal.util.IgniteSpinBusyLock; +import org.apache.ignite.internal.vault.VaultManager; +import org.apache.ignite.internal.vault.inmemory.InMemoryVaultService; +import org.apache.ignite.network.ClusterNode; +import org.apache.ignite.network.ClusterService; +import org.apache.ignite.network.NetworkAddress; +import org.jetbrains.annotations.Nullable; +import org.mockito.ArgumentMatchers; +import org.mockito.Mockito; + +/** + * MetaStorageManager dummy implementation. + */ +public class StandaloneMetastorageManager extends MetaStorageManagerImpl { + private static final String TEST_NODE_NAME = "test"; + private final MetaStorageServiceImpl metaStorageService; + + /** + * Creates standalone MetaStorage manager. + */ + public static MetaStorageManager create() { + VaultManager vaultMgr = new VaultManager(new InMemoryVaultService()); + SimpleInMemoryKeyValueStorage storage = new SimpleInMemoryKeyValueStorage(TEST_NODE_NAME); + + ClusterManagementGroupManager cmgMgr = Mockito.mock(ClusterManagementGroupManager.class); + Mockito.when(cmgMgr.metaStorageNodes()).thenReturn(completedFuture(Set.of())).getMock(); + + return new StandaloneMetastorageManager(vaultMgr, cmgMgr, storage) { + @Override + public void start() { + vaultMgr.start(); + storage.start(); + + super.start(); + } + + @Override + public void stop() throws Exception { + super.stop(); + vaultMgr.stop(); + } + }; + } + + /** + * The constructor. + * + * @param vaultMgr Vault manager. + * @param cmgMgr Cluster management group manager. + * @param storage Storage. + */ + protected StandaloneMetastorageManager( + VaultManager vaultMgr, + ClusterManagementGroupManager cmgMgr, + KeyValueStorage storage + ) { + super(vaultMgr, Mockito.mock(ClusterService.class), cmgMgr, Mockito.mock(LogicalTopologyService.class), + Mockito.mock(RaftManager.class), storage); + + MetaStorageListener metaStorageListener = new MetaStorageListener(storage); + + RaftGroupService raftGroupService = Mockito.mock(RaftGroupService.class); + Mockito.when(raftGroupService.run(ArgumentMatchers.any())) + .thenAnswer(invocation -> runCommand(invocation.getArgument(0), metaStorageListener)); + + var localNode = new ClusterNode(TEST_NODE_NAME, TEST_NODE_NAME, new NetworkAddress("localhost", 10000)); + + this.metaStorageService = new MetaStorageServiceImpl(raftGroupService, new IgniteSpinBusyLock(), localNode); + } + + @Override + protected CompletableFuture<MetaStorageServiceImpl> initializeMetaStorage(Set<String> metaStorageNodes) { + return completedFuture(metaStorageService); + } + + private static CompletableFuture<Serializable> runCommand(Command command, MetaStorageListener listener) { + AtomicReference<CompletableFuture<Serializable>> resRef = new AtomicReference<>(); + + CommandClosure<? extends Command> closure = new CommandClosure<>() { + @Override + public Command command() { + return command; + } + + @Override + public void result(@Nullable Serializable res) { + resRef.set(res instanceof Throwable ? failedFuture((Throwable) res) : completedFuture(res)); + } + }; + + if (command instanceof ReadCommand) { + listener.onRead(singleton((CommandClosure<ReadCommand>) closure).iterator()); + } else { + listener.onWrite(singleton((CommandClosure<WriteCommand>) closure).iterator()); + } + + return resRef.get(); + } +}
