Repository: accumulo
Updated Branches:
  refs/heads/master e0ef0ca42 -> dd99cbff2


ACCUMULO-3339 found some more metadata clean-up to move into TabletData


Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo
Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/0721a6b6
Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/0721a6b6
Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/0721a6b6

Branch: refs/heads/master
Commit: 0721a6b6183dd0c268ed7092b0b588f49596de0d
Parents: 3e5acd5
Author: Eric C. Newton <eric.new...@gmail.com>
Authored: Mon Jul 6 15:24:29 2015 -0400
Committer: Eric C. Newton <eric.new...@gmail.com>
Committed: Mon Jul 6 15:24:29 2015 -0400

----------------------------------------------------------------------
 .../apache/accumulo/tserver/TabletServer.java   |  5 +-
 .../apache/accumulo/tserver/tablet/Tablet.java  | 85 ++++++--------------
 .../accumulo/tserver/tablet/TabletData.java     | 45 ++++++++---
 3 files changed, 58 insertions(+), 77 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/0721a6b6/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
----------------------------------------------------------------------
diff --git 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
index a8be243..5d3e0f0 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletServer.java
@@ -159,7 +159,6 @@ import org.apache.accumulo.server.fs.FileRef;
 import org.apache.accumulo.server.fs.VolumeManager;
 import org.apache.accumulo.server.fs.VolumeManager.FileType;
 import org.apache.accumulo.server.fs.VolumeManagerImpl;
-import org.apache.accumulo.server.fs.VolumeUtil;
 import org.apache.accumulo.server.log.SortedLogState;
 import org.apache.accumulo.server.log.WalStateManager;
 import org.apache.accumulo.server.log.WalStateManager.WalMarkerException;
@@ -2131,12 +2130,10 @@ public class TabletServer extends AccumuloServerContext 
implements Runnable {
         TabletResourceManager trm = 
resourceManager.createTabletResourceManager(extent, 
getTableConfiguration(extent));
         TabletData data;
         if (extent.isRootTablet()) {
-          data = new TabletData(fs, ZooReaderWriter.getInstance());
+          data = new TabletData(fs, ZooReaderWriter.getInstance(), 
getTableConfiguration(extent));
         } else {
           data = new TabletData(extent, fs, 
tabletsKeyValues.entrySet().iterator());
         }
-        // this opens the tablet file and fills in the endKey in the extent
-        data.setDirectory(VolumeUtil.switchRootTabletVolume(extent, 
data.getDirectory()));
 
         tablet = new Tablet(TabletServer.this, extent, trm, data);
         // If a minor compaction starts after a tablet opens, this indicates a 
log recovery occurred. This recovered data must be minor compacted.

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0721a6b6/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
----------------------------------------------------------------------
diff --git 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
index 307044f..8fcf035 100644
--- 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
+++ 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
@@ -173,7 +173,7 @@ public class Tablet implements TabletCommitter {
   private final Object timeLock = new Object();
   private long persistedTime;
 
-  private TServerInstance lastLocation;
+  private TServerInstance lastLocation = null;
   private volatile boolean tableDirChecked = false;
 
   private final AtomicLong dataSourceDeletions = new AtomicLong(0);
@@ -309,6 +309,17 @@ public class Tablet implements TabletCommitter {
 
   public Tablet(final TabletServer tabletServer, final KeyExtent extent, final 
TabletResourceManager trm, TabletData data) throws IOException {
 
+    this.tabletServer = tabletServer;
+    this.extent = extent;
+    this.tabletResources = trm;
+    this.lastLocation = data.getLastLocation();
+    this.lastFlushID = data.getFlushID();
+    this.lastCompactID = data.getCompactID();
+    this.splitCreationTime = data.getSplitTime();
+    this.tabletTime = TabletTime.getInstance(data.getTime());
+    this.persistedTime = tabletTime.getTime();
+    this.logId = tabletServer.createLogId(extent);
+
     TableConfiguration tblConf = tabletServer.getTableConfiguration(extent);
     if (null == tblConf) {
       Tables.clearCache(tabletServer.getInstance());
@@ -318,71 +329,28 @@ public class Tablet implements TabletCommitter {
 
     this.tableConfiguration = tblConf;
 
-    TabletFiles tabletPaths = VolumeUtil
-        .updateTabletVolumes(tabletServer, tabletServer.getLock(), 
tabletServer.getFileSystem(), extent,
-            new TabletFiles(data.getDirectory(), data.getLogEntris(), 
data.getDataFiles()),
-            ReplicationConfigurationUtil.isEnabled(extent, 
this.tableConfiguration));
+    // translate any volume changes
+    VolumeManager fs = tabletServer.getFileSystem();
+    boolean replicationEnabled = 
ReplicationConfigurationUtil.isEnabled(extent, this.tableConfiguration);
+    TabletFiles tabletPaths = new TabletFiles(data.getDirectory(), 
data.getLogEntris(), data.getDataFiles());
+    tabletPaths = VolumeUtil.updateTabletVolumes(tabletServer, 
tabletServer.getLock(), fs, extent, tabletPaths, replicationEnabled);
 
+    // deal with relative path for the directory
     Path locationPath;
-
     if (tabletPaths.dir.contains(":")) {
-      locationPath = new Path(tabletPaths.dir.toString());
+      locationPath = new Path(tabletPaths.dir);
     } else {
-      locationPath = tabletServer.getFileSystem().getFullPath(FileType.TABLE, 
extent.getTableId().toString() + tabletPaths.dir.toString());
+      locationPath = tabletServer.getFileSystem().getFullPath(FileType.TABLE, 
extent.getTableId().toString() + tabletPaths.dir);
     }
-
-    final List<LogEntry> logEntries = tabletPaths.logEntries;
-    final SortedMap<FileRef,DataFileValue> datafiles = tabletPaths.datafiles;
-
     this.location = locationPath;
-    this.lastLocation = data.getLastLocation();
     this.tabletDirectory = tabletPaths.dir;
-
-    this.extent = extent;
-    this.tabletResources = trm;
-
-    this.lastFlushID = data.getFlushID();
-    this.lastCompactID = data.getCompactID();
-    this.splitCreationTime = data.getSplitTime();
-    String time = data.getTime();
-
-    if (extent.isRootTablet()) {
-      long rtime = Long.MIN_VALUE;
-      for (FileRef ref : datafiles.keySet()) {
-        Path path = ref.path();
-        FileSystem ns = 
tabletServer.getFileSystem().getVolumeByPath(path).getFileSystem();
-        FileSKVIterator reader = 
FileOperations.getInstance().openReader(path.toString(), true, ns, 
ns.getConf(), tabletServer.getTableConfiguration(extent));
-        long maxTime = -1;
-        try {
-
-          while (reader.hasTop()) {
-            maxTime = Math.max(maxTime, reader.getTopKey().getTimestamp());
-            reader.next();
-          }
-
-        } finally {
-          reader.close();
-        }
-
-        if (maxTime > rtime) {
-          time = TabletTime.LOGICAL_TIME_ID + "" + maxTime;
-          rtime = maxTime;
-        }
-      }
-    }
-    if (time == null && datafiles.isEmpty() && 
extent.equals(RootTable.OLD_EXTENT)) {
-      // recovery... old root tablet has no data, so time doesn't matter:
-      time = TabletTime.LOGICAL_TIME_ID + "" + Long.MIN_VALUE;
+    for (Entry<Long,List<FileRef>> entry : data.getBulkImported().entrySet()) {
+      this.bulkImported.put(entry.getKey(), new 
CopyOnWriteArrayList<FileRef>(entry.getValue()));
     }
-
-    this.tabletServer = tabletServer;
-    this.logId = tabletServer.createLogId(extent);
-
     setupDefaultSecurityLabels(extent);
 
-    tabletMemory = new TabletMemory(this);
-    tabletTime = TabletTime.getInstance(time);
-    persistedTime = tabletTime.getTime();
+    final List<LogEntry> logEntries = tabletPaths.logEntries;
+    final SortedMap<FileRef,DataFileValue> datafiles = tabletPaths.datafiles;
 
     tableConfiguration.addObserver(configObserver = new 
ConfigurationObserver() {
 
@@ -425,13 +393,10 @@ public class Tablet implements TabletCommitter {
     });
 
     tableConfiguration.getNamespaceConfiguration().addObserver(configObserver);
+    tabletMemory = new TabletMemory(this);
 
     // Force a load of any per-table properties
     configObserver.propertiesChanged();
-    for (Entry<Long,List<FileRef>> entry : data.getBulkImported().entrySet()) {
-      this.bulkImported.put(entry.getKey(), new 
CopyOnWriteArrayList<FileRef>(entry.getValue()));
-    }
-
     if (!logEntries.isEmpty()) {
       log.info("Starting Write-Ahead Log recovery for " + this.extent);
       final AtomicLong entriesUsedOnTablet = new AtomicLong(0);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0721a6b6/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/TabletData.java
----------------------------------------------------------------------
diff --git 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/TabletData.java
 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/TabletData.java
index cb9015e..bfbf33f 100644
--- 
a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/TabletData.java
+++ 
b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/TabletData.java
@@ -33,9 +33,12 @@ import java.util.Map.Entry;
 import java.util.SortedMap;
 import java.util.TreeMap;
 
+import org.apache.accumulo.core.conf.AccumuloConfiguration;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.data.impl.KeyExtent;
+import org.apache.accumulo.core.file.FileOperations;
+import org.apache.accumulo.core.file.FileSKVIterator;
 import org.apache.accumulo.core.metadata.RootTable;
 import org.apache.accumulo.core.metadata.schema.DataFileValue;
 import 
org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.BulkFileColumnFamily;
@@ -48,9 +51,12 @@ import org.apache.accumulo.core.tabletserver.log.LogEntry;
 import org.apache.accumulo.fate.zookeeper.ZooReader;
 import org.apache.accumulo.server.fs.FileRef;
 import org.apache.accumulo.server.fs.VolumeManager;
+import org.apache.accumulo.server.fs.VolumeUtil;
 import org.apache.accumulo.server.master.state.TServerInstance;
+import org.apache.accumulo.server.tablets.TabletTime;
 import org.apache.accumulo.server.util.MetadataTableUtil;
 import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.Text;
 import org.slf4j.Logger;
@@ -119,38 +125,55 @@ public class TabletData {
         }
       }
     }
+    if (time == null && dataFiles.isEmpty() && 
extent.equals(RootTable.OLD_EXTENT)) {
+      // recovery... old root tablet has no data, so time doesn't matter:
+      time = TabletTime.LOGICAL_TIME_ID + "" + Long.MIN_VALUE;
+    }
   }
 
   // Read basic root table metadata from zookeeper
-  public TabletData(VolumeManager fs, ZooReader rdr) throws IOException {
+  public TabletData(VolumeManager fs, ZooReader rdr, AccumuloConfiguration 
conf) throws IOException {
     Path location = new Path(MetadataTableUtil.getRootTabletDir());
 
     // cleanReplacement() has special handling for deleting files
     FileStatus[] files = fs.listStatus(location);
     Collection<String> goodPaths = RootFiles.cleanupReplacement(fs, files, 
true);
+    long rtime = Long.MIN_VALUE;
     for (String good : goodPaths) {
       Path path = new Path(good);
       String filename = path.getName();
       FileRef ref = new FileRef(location.toString() + "/" + filename, path);
       DataFileValue dfv = new DataFileValue(0, 0);
       dataFiles.put(ref, dfv);
+
+      FileSystem ns = fs.getVolumeByPath(path).getFileSystem();
+      FileSKVIterator reader = 
FileOperations.getInstance().openReader(path.toString(), true, ns, 
ns.getConf(), conf);
+      long maxTime = -1;
+      try {
+        while (reader.hasTop()) {
+          maxTime = Math.max(maxTime, reader.getTopKey().getTimestamp());
+          reader.next();
+        }
+      } finally {
+        reader.close();
+      }
+      if (maxTime > rtime) {
+        time = TabletTime.LOGICAL_TIME_ID + "" + maxTime;
+        rtime = maxTime;
+      }
     }
+
     try {
       logEntris = MetadataTableUtil.getLogEntries(null, RootTable.EXTENT);
     } catch (Exception ex) {
       throw new RuntimeException("Unable to read tablet log entries", ex);
     }
-    directory = MetadataTableUtil.getRootTabletDir();
+    directory = VolumeUtil.switchRootTabletVolume(RootTable.EXTENT, 
MetadataTableUtil.getRootTabletDir());
   }
 
   // Data pulled from an existing tablet to make a split
-  public TabletData(String tabletDirectory,
-      SortedMap<FileRef,DataFileValue> highDatafileSizes,
-      String time,
-      long lastFlushID,
-      long lastCompactID,
-      TServerInstance lastLocation,
-      Map<Long,List<FileRef>> bulkIngestedFiles) {
+  public TabletData(String tabletDirectory, SortedMap<FileRef,DataFileValue> 
highDatafileSizes, String time, long lastFlushID, long lastCompactID,
+      TServerInstance lastLocation, Map<Long,List<FileRef>> bulkIngestedFiles) 
{
     this.directory = tabletDirectory;
     this.dataFiles = highDatafileSizes;
     this.time = time;
@@ -201,10 +224,6 @@ public class TabletData {
     return directory;
   }
 
-  public void setDirectory(String directory) {
-    this.directory = directory;
-  }
-
   public long getSplitTime() {
     return splitTime;
   }

Reply via email to