You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by cs...@apache.org on 2023/06/16 19:43:05 UTC

[accumulo] branch main updated: StoredTabletFile now lazy loads ReferencedTabletFile (#3502)

This is an automated email from the ASF dual-hosted git repository.

cshannon 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 3f491a4885 StoredTabletFile now lazy loads ReferencedTabletFile (#3502)
3f491a4885 is described below

commit 3f491a4885783f3bcf43391ba0f06381a1df7118
Author: Christopher L. Shannon <ch...@gmail.com>
AuthorDate: Fri Jun 16 15:43:00 2023 -0400

    StoredTabletFile now lazy loads ReferencedTabletFile (#3502)
    
    This improves performance because creating a ReferencedTabletFile does a
    lot of validation which can be slow due to the calls to Path.getParent()
    if there are several files created. Filename validation was also removed
    from the constructor as well to further improve performance.
    
    Removing/delaying the validation checks should be safe because a
    StoredTabletFile references an existing Tablet file that was already
    stored in Metadata so the Path has already been validated before. Also,
    the ReferencedTabletFile is not needed often so it makes sense to delay
    the creation/validation until it's actually needed.
---
 .../apache/accumulo/core/metadata/AbstractTabletFile.java   |  1 -
 .../apache/accumulo/core/metadata/ReferencedTabletFile.java |  3 +++
 .../org/apache/accumulo/core/metadata/StoredTabletFile.java | 13 ++++++++-----
 .../accumulo/core/metadata/UnreferencedTabletFile.java      |  1 +
 4 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/AbstractTabletFile.java b/core/src/main/java/org/apache/accumulo/core/metadata/AbstractTabletFile.java
index 587636c207..99b4a00698 100644
--- a/core/src/main/java/org/apache/accumulo/core/metadata/AbstractTabletFile.java
+++ b/core/src/main/java/org/apache/accumulo/core/metadata/AbstractTabletFile.java
@@ -37,7 +37,6 @@ public abstract class AbstractTabletFile<T extends AbstractTabletFile<T>>
   protected AbstractTabletFile(Path path) {
     this.path = Objects.requireNonNull(path);
     this.fileName = path.getName();
-    ValidationUtil.validateFileName(fileName);
   }
 
   @Override
diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/ReferencedTabletFile.java b/core/src/main/java/org/apache/accumulo/core/metadata/ReferencedTabletFile.java
index abda1e5672..53e72811e5 100644
--- a/core/src/main/java/org/apache/accumulo/core/metadata/ReferencedTabletFile.java
+++ b/core/src/main/java/org/apache/accumulo/core/metadata/ReferencedTabletFile.java
@@ -56,6 +56,9 @@ public class ReferencedTabletFile extends AbstractTabletFile<ReferencedTabletFil
     String errorMsg = "Missing or invalid part of tablet file metadata entry: " + metaPath;
     log.trace("Parsing TabletFile from {}", metaPath);
 
+    // Validate characters in file name
+    ValidationUtil.validateFileName(path.getName());
+
     // use Path object to step backwards from the filename through all the parts
     Path tabletDirPath = Objects.requireNonNull(metaPath.getParent(), errorMsg);
 
diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java b/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java
index 4b517360d1..379aab4d8c 100644
--- a/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java
+++ b/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java
@@ -19,11 +19,14 @@
 package org.apache.accumulo.core.metadata;
 
 import java.util.Objects;
+import java.util.function.Supplier;
 
 import org.apache.accumulo.core.data.TableId;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.Text;
 
+import com.google.common.base.Suppliers;
+
 /**
  * Object representing a tablet file entry stored in the metadata table. Keeps a string of the exact
  * entry of what is in the metadata table, which is important for updating and deleting metadata
@@ -37,7 +40,7 @@ import org.apache.hadoop.io.Text;
  */
 public class StoredTabletFile extends AbstractTabletFile<StoredTabletFile> {
   private final String metadataEntry;
-  private final ReferencedTabletFile referencedTabletFile;
+  private final Supplier<ReferencedTabletFile> referencedTabletFile;
 
   /**
    * Construct a tablet file using the string read from the metadata. Preserve the exact string so
@@ -46,7 +49,7 @@ public class StoredTabletFile extends AbstractTabletFile<StoredTabletFile> {
   public StoredTabletFile(String metadataEntry) {
     super(new Path(metadataEntry));
     this.metadataEntry = metadataEntry;
-    this.referencedTabletFile = ReferencedTabletFile.of(getPath());
+    this.referencedTabletFile = Suppliers.memoize(() -> ReferencedTabletFile.of(getPath()));
   }
 
   /**
@@ -66,15 +69,15 @@ public class StoredTabletFile extends AbstractTabletFile<StoredTabletFile> {
   }
 
   public ReferencedTabletFile getTabletFile() {
-    return referencedTabletFile;
+    return referencedTabletFile.get();
   }
 
   public TableId getTableId() {
-    return referencedTabletFile.getTableId();
+    return referencedTabletFile.get().getTableId();
   }
 
   public String getNormalizedPathStr() {
-    return referencedTabletFile.getNormalizedPathStr();
+    return referencedTabletFile.get().getNormalizedPathStr();
   }
 
   /**
diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/UnreferencedTabletFile.java b/core/src/main/java/org/apache/accumulo/core/metadata/UnreferencedTabletFile.java
index a43fe48443..402b3b9194 100644
--- a/core/src/main/java/org/apache/accumulo/core/metadata/UnreferencedTabletFile.java
+++ b/core/src/main/java/org/apache/accumulo/core/metadata/UnreferencedTabletFile.java
@@ -42,6 +42,7 @@ public class UnreferencedTabletFile extends AbstractTabletFile<UnreferencedTable
 
   public UnreferencedTabletFile(FileSystem fs, Path path) {
     super(Objects.requireNonNull(fs).makeQualified(Objects.requireNonNull(path)));
+    ValidationUtil.validateFileName(path.getName());
   }
 
   @Override