This is an automated email from the ASF dual-hosted git repository.
kturner pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/main by this push:
new ef213b520b replaces sorted map w/ list for key vals in tablet metadata
(#4600)
ef213b520b is described below
commit ef213b520b2485f356cec7fd65f3ff4b66f43840
Author: Keith Turner <[email protected]>
AuthorDate: Fri May 24 12:08:08 2024 -0400
replaces sorted map w/ list for key vals in tablet metadata (#4600)
This change was made in elasticity as part of a larger change
to speedup merge, see #4574. Backported just the part that
replaced a sortedmap w/ a list in TabletMetadata to speed up
the code that tracks a tablets key/values.
---
.../core/metadata/schema/TabletMetadata.java | 20 +++++++++-----------
.../core/metadata/schema/TabletMetadataTest.java | 10 ++++++----
.../accumulo/server/util/MetadataTableUtil.java | 8 ++++----
3 files changed, 19 insertions(+), 19 deletions(-)
diff --git
a/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java
b/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java
index f2ad719fd8..33d307ce59 100644
---
a/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java
+++
b/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java
@@ -37,7 +37,6 @@ import java.util.Objects;
import java.util.Optional;
import java.util.OptionalLong;
import java.util.Set;
-import java.util.SortedMap;
import org.apache.accumulo.core.Constants;
import org.apache.accumulo.core.clientImpl.ClientContext;
@@ -78,7 +77,6 @@ import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.ImmutableSortedMap.Builder;
import com.google.common.net.HostAndPort;
@@ -102,7 +100,7 @@ public class TabletMetadata {
private final String dirName;
private final MetadataTime time;
private final String cloned;
- private final SortedMap<Key,Value> keyValues;
+ private final List<Entry<Key,Value>> keyValues;
private final OptionalLong flush;
private final List<LogEntry> logs;
private final OptionalLong compact;
@@ -127,8 +125,8 @@ public class TabletMetadata {
this.dirName = tmBuilder.dirName;
this.time = tmBuilder.time;
this.cloned = tmBuilder.cloned;
- this.keyValues =
Optional.ofNullable(tmBuilder.keyValues).map(ImmutableSortedMap.Builder::build)
- .orElse(null);
+ this.keyValues =
+
Optional.ofNullable(tmBuilder.keyValues).map(ImmutableList.Builder::build).orElse(null);
this.flush = tmBuilder.flush;
this.logs = Objects.requireNonNull(tmBuilder.logs.build());
this.compact = Objects.requireNonNull(tmBuilder.compact);
@@ -382,7 +380,7 @@ public class TabletMetadata {
return merged;
}
- public SortedMap<Key,Value> getKeyValues() {
+ public List<Entry<Key,Value>> getKeyValues() {
Preconditions.checkState(keyValues != null, "Requested key values when it
was not saved");
return keyValues;
}
@@ -430,7 +428,7 @@ public class TabletMetadata {
final String qual = key.getColumnQualifierData().toString();
if (buildKeyValueMap) {
- tmBuilder.keyValue(key, kv.getValue());
+ tmBuilder.keyValue(kv);
}
if (row == null) {
@@ -579,7 +577,7 @@ public class TabletMetadata {
private String dirName;
private MetadataTime time;
private String cloned;
- private ImmutableSortedMap.Builder<Key,Value> keyValues;
+ private ImmutableList.Builder<Entry<Key,Value>> keyValues;
private OptionalLong flush = OptionalLong.empty();
private final ImmutableList.Builder<LogEntry> logs =
ImmutableList.builder();
private OptionalLong compact = OptionalLong.empty();
@@ -676,11 +674,11 @@ public class TabletMetadata {
this.merged = merged;
}
- void keyValue(Key key, Value value) {
+ void keyValue(Entry<Key,Value> kv) {
if (this.keyValues == null) {
- this.keyValues = ImmutableSortedMap.naturalOrder();
+ this.keyValues = ImmutableList.builder();
}
- this.keyValues.put(key, value);
+ this.keyValues.add(kv);
}
TabletMetadata build(EnumSet<ColumnType> fetchedCols) {
diff --git
a/core/src/test/java/org/apache/accumulo/core/metadata/schema/TabletMetadataTest.java
b/core/src/test/java/org/apache/accumulo/core/metadata/schema/TabletMetadataTest.java
index 3b2b4a85ac..8c3d84de2c 100644
---
a/core/src/test/java/org/apache/accumulo/core/metadata/schema/TabletMetadataTest.java
+++
b/core/src/test/java/org/apache/accumulo/core/metadata/schema/TabletMetadataTest.java
@@ -40,6 +40,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.lang.reflect.Constructor;
+import java.util.AbstractMap;
import java.util.EnumSet;
import java.util.LinkedHashSet;
import java.util.List;
@@ -160,7 +161,9 @@ public class TabletMetadataTest {
assertEquals(Set.of(tf1, tf2), Set.copyOf(tm.getFiles()));
assertEquals(Map.of(tf1, dfv1, tf2, dfv2), tm.getFilesMap());
assertEquals(6L, tm.getFlushId().getAsLong());
- assertEquals(rowMap, tm.getKeyValues());
+ TreeMap<Key,Value> actualRowMap = new TreeMap<>();
+ tm.getKeyValues().forEach(entry -> actualRowMap.put(entry.getKey(),
entry.getValue()));
+ assertEquals(rowMap, actualRowMap);
assertEquals(Map.of(new StoredTabletFile(bf1), 56L, new
StoredTabletFile(bf2), 59L),
tm.getLoaded());
assertEquals(HostAndPort.fromParts("server1", 8555),
tm.getLocation().getHostAndPort());
@@ -388,7 +391,7 @@ public class TabletMetadataTest {
b.log(LogEntry.fromPath("localhost+8020/" + UUID.randomUUID()));
b.scan(stf);
b.loadedFile(stf, 0L);
- b.keyValue(new Key(), new Value());
+ b.keyValue(new AbstractMap.SimpleImmutableEntry<>(new Key(), new Value()));
var tm2 = b.build(EnumSet.allOf(ColumnType.class));
assertEquals(1, tm2.getExternalCompactions().size());
@@ -407,8 +410,7 @@ public class TabletMetadataTest {
assertEquals(1, tm2.getLoaded().size());
assertThrows(UnsupportedOperationException.class, () ->
tm2.getLoaded().put(stf, 0L));
assertEquals(1, tm2.getKeyValues().size());
- assertThrows(UnsupportedOperationException.class,
- () -> tm2.getKeyValues().put(new Key(), new Value()));
+ assertThrows(UnsupportedOperationException.class, () ->
tm2.getKeyValues().remove(null));
}
diff --git
a/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java
b/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java
index 9209f82e60..e53c908907 100644
---
a/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java
+++
b/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java
@@ -398,12 +398,12 @@ public class MetadataTableUtil {
}
private static Mutation createCloneMutation(TableId srcTableId, TableId
tableId,
- Map<Key,Value> tablet) {
+ Iterable<Entry<Key,Value>> tablet) {
- KeyExtent ke =
KeyExtent.fromMetaRow(tablet.keySet().iterator().next().getRow());
+ KeyExtent ke =
KeyExtent.fromMetaRow(tablet.iterator().next().getKey().getRow());
Mutation m = new Mutation(TabletsSection.encodeRow(tableId, ke.endRow()));
- for (Entry<Key,Value> entry : tablet.entrySet()) {
+ for (Entry<Key,Value> entry : tablet) {
if (entry.getKey().getColumnFamily().equals(DataFileColumnFamily.NAME)) {
String cf = entry.getKey().getColumnQualifier().toString();
if (!cf.startsWith("../") && !cf.contains(":")) {
@@ -538,7 +538,7 @@ public class MetadataTableUtil {
// delete existing cloned tablet entry
Mutation m = new Mutation(cloneTablet.getExtent().toMetaRow());
- for (Entry<Key,Value> entry : cloneTablet.getKeyValues().entrySet()) {
+ for (Entry<Key,Value> entry : cloneTablet.getKeyValues()) {
Key k = entry.getKey();
m.putDelete(k.getColumnFamily(), k.getColumnQualifier(),
k.getTimestamp());
}