This is an automated email from the ASF dual-hosted git repository. dlmarion pushed a commit to branch elasticity in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/elasticity by this push: new 57cb4ba7f4 Fixed TabletManagmentParameters serialization of replacements (#4184) 57cb4ba7f4 is described below commit 57cb4ba7f4487c3cebfdb0aaa6b520a3d5bdd9fa Author: Dave Marion <dlmar...@apache.org> AuthorDate: Wed Jan 24 16:56:25 2024 -0500 Fixed TabletManagmentParameters serialization of replacements (#4184) TabletManagementParameters was still using a List<Pair<Path,Path>> for volume replacements serialization. This was changed to a Map<Path,Path> in other places of the code because there was an issue with Gson serialization. I added a test for serialization and deserialization and was able to successfully use a Map when setting enableComplexMapKeySerialization() on the Gson object. Fixes #4107 Co-authored-by: Keith Turner <ktur...@apache.org> --- .../manager/state/TabletManagementParameters.java | 28 ++++---- .../state/TabletManagementParametersTest.java | 76 ++++++++++++++++++++++ 2 files changed, 91 insertions(+), 13 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/manager/state/TabletManagementParameters.java b/server/base/src/main/java/org/apache/accumulo/server/manager/state/TabletManagementParameters.java index c6bfbe3fc3..6dbcee6d03 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/manager/state/TabletManagementParameters.java +++ b/server/base/src/main/java/org/apache/accumulo/server/manager/state/TabletManagementParameters.java @@ -31,7 +31,6 @@ import java.util.Base64; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Supplier; @@ -42,7 +41,6 @@ import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.manager.thrift.ManagerState; import org.apache.accumulo.core.metadata.TServerInstance; import org.apache.accumulo.core.metadata.schema.Ample; -import org.apache.accumulo.core.util.Pair; import org.apache.accumulo.server.manager.LiveTServerSet; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.DataInputBuffer; @@ -57,7 +55,10 @@ import com.google.gson.GsonBuilder; * {@link TabletManagementIterator} to make decisions about tablets. */ public class TabletManagementParameters { - // ELASTICITY_TODO need to unit test serialization and deserialization of this class. + + private static final Gson GSON = + new GsonBuilder().enableComplexMapKeySerialization().disableHtmlEscaping().create(); + private final ManagerState managerState; private final Map<Ample.DataLevel,Boolean> parentUpgradeMap; private final Set<TableId> onlineTables; @@ -99,7 +100,7 @@ public class TabletManagementParameters { return Map.copyOf(resourceGroups); }); this.canSuspendTablets = canSuspendTablets; - this.volumeReplacements = volumeReplacements; + this.volumeReplacements = Map.copyOf(volumeReplacements); } private TabletManagementParameters(JsonData jdata) { @@ -125,14 +126,17 @@ public class TabletManagementParameters { return Map.copyOf(resourceGroups); }); this.canSuspendTablets = jdata.canSuspendTablets; - this.volumeReplacements = jdata.volumeReplacements.stream() - .collect(toUnmodifiableMap(Pair::getFirst, Pair::getSecond)); + this.volumeReplacements = Collections.unmodifiableMap(jdata.volumeReplacements); } public ManagerState getManagerState() { return managerState; } + public Map<Ample.DataLevel,Boolean> getParentUpgradeMap() { + return parentUpgradeMap; + } + public boolean isParentLevelUpgraded() { return parentUpgradeMap.get(level); } @@ -189,6 +193,7 @@ public class TabletManagementParameters { } private static class JsonData { + final ManagerState managerState; final Map<Ample.DataLevel,Boolean> parentUpgradeMap; final Collection<String> onlineTables; @@ -203,7 +208,7 @@ public class TabletManagementParameters { final Map<Long,Map<String,String>> compactionHints; final boolean canSuspendTablets; - final List<Pair<Path,Path>> volumeReplacements; + final Map<Path,Path> volumeReplacements; private static String toString(KeyExtent extent) { DataOutputBuffer buffer = new DataOutputBuffer(); @@ -245,20 +250,17 @@ public class TabletManagementParameters { .map(TServerInstance::getHostPortSession).collect(toSet()))); compactionHints = params.compactionHints; canSuspendTablets = params.canSuspendTablets; - volumeReplacements = - params.volumeReplacements.entrySet().stream().map(Pair::fromEntry).collect(toList()); + volumeReplacements = params.volumeReplacements; } } public String serialize() { - Gson gson = new GsonBuilder().disableHtmlEscaping().create(); - return gson.toJson(new JsonData(this)); + return GSON.toJson(new JsonData(this)); } public static TabletManagementParameters deserialize(String json) { - Gson gson = new GsonBuilder().disableHtmlEscaping().create(); - JsonData jdata = gson.fromJson(json, JsonData.class); + JsonData jdata = GSON.fromJson(json, JsonData.class); return new TabletManagementParameters(jdata); } diff --git a/server/base/src/test/java/org/apache/accumulo/server/manager/state/TabletManagementParametersTest.java b/server/base/src/test/java/org/apache/accumulo/server/manager/state/TabletManagementParametersTest.java new file mode 100644 index 0000000000..101157c44b --- /dev/null +++ b/server/base/src/test/java/org/apache/accumulo/server/manager/state/TabletManagementParametersTest.java @@ -0,0 +1,76 @@ +/* + * 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 + * + * https://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.accumulo.server.manager.state; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Map; +import java.util.Set; + +import org.apache.accumulo.core.Constants; +import org.apache.accumulo.core.data.TableId; +import org.apache.accumulo.core.dataImpl.KeyExtent; +import org.apache.accumulo.core.manager.thrift.ManagerState; +import org.apache.accumulo.core.metadata.TServerInstance; +import org.apache.accumulo.core.metadata.schema.Ample; +import org.apache.accumulo.server.manager.LiveTServerSet; +import org.apache.hadoop.fs.Path; +import org.junit.jupiter.api.Test; + +public class TabletManagementParametersTest { + + @Test + public void testDeSer() { + + final ManagerState managerState = ManagerState.NORMAL; + final Map<Ample.DataLevel,Boolean> parentUpgradeMap = Map.of(Ample.DataLevel.ROOT, true, + Ample.DataLevel.USER, true, Ample.DataLevel.METADATA, true); + final Set<TableId> onlineTables = Set.of(TableId.of("1"), TableId.of("2"), TableId.of("3")); + final Set<TServerInstance> tservers = Set.of(new TServerInstance("127.0.0.1:10000", 0), + new TServerInstance("127.0.0.1:10001", 1)); + final LiveTServerSet.LiveTServersSnapshot serverSnapshot = + new LiveTServerSet.LiveTServersSnapshot(tservers, + Map.of(Constants.DEFAULT_RESOURCE_GROUP_NAME, tservers)); + final Set<TServerInstance> serversToShutdown = Set.of(); + final Map<KeyExtent,TServerInstance> migrations = Map.of(); + final Ample.DataLevel dataLevel = Ample.DataLevel.USER; + final Map<Long,Map<String,String>> compactionHints = Map.of(); + final boolean canSuspendTablets = true; + final Map<Path,Path> replacements = + Map.of(new Path("file:/vol1/accumulo/inst_id"), new Path("file:/vol2/accumulo/inst_id")); + + final TabletManagementParameters tmp = new TabletManagementParameters(managerState, + parentUpgradeMap, onlineTables, serverSnapshot, serversToShutdown, migrations, dataLevel, + compactionHints, canSuspendTablets, replacements); + + String jsonString = tmp.serialize(); + TabletManagementParameters tmp2 = TabletManagementParameters.deserialize(jsonString); + + assertEquals(managerState, tmp2.getManagerState()); + assertEquals(parentUpgradeMap, tmp2.getParentUpgradeMap()); + assertEquals(onlineTables, tmp2.getOnlineTables()); + assertEquals(tservers, tmp2.getOnlineTsevers()); + assertEquals(serversToShutdown, tmp2.getServersToShutdown()); + assertEquals(migrations, tmp2.getMigrations()); + assertEquals(dataLevel, tmp2.getLevel()); + assertEquals(compactionHints, tmp2.getCompactionHints()); + assertEquals(canSuspendTablets, tmp2.canSuspendTablets()); + assertEquals(replacements, tmp2.getVolumeReplacements()); + } +}