You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by ct...@apache.org on 2014/02/26 22:16:31 UTC

[1/2] git commit: ACCUMULO-2291 CheckForMetadataProblems now checks the root table as well as the metadata table for problems. Also removed the fix option for the metadata table.

Repository: accumulo
Updated Branches:
  refs/heads/1.6.0-SNAPSHOT 59716f06b -> 818426c3a


ACCUMULO-2291 CheckForMetadataProblems now checks the root table as well as the metadata table for problems. Also removed the fix option for the metadata table.

Signed-off-by: Christopher Tubbs <ct...@apache.org>


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

Branch: refs/heads/1.6.0-SNAPSHOT
Commit: 0c4a956633f96a3426df94dcfefee4e86e5aa3f6
Parents: 59716f0
Author: jpmcnamee <jp...@terpmail.umd.edu>
Authored: Fri Feb 21 09:49:04 2014 -0500
Committer: Christopher Tubbs <ct...@apache.org>
Committed: Wed Feb 26 16:01:00 2014 -0500

----------------------------------------------------------------------
 .../server/util/CheckForMetadataProblems.java   | 100 ++++++++-----------
 1 file changed, 43 insertions(+), 57 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/0c4a9566/server/base/src/main/java/org/apache/accumulo/server/util/CheckForMetadataProblems.java
----------------------------------------------------------------------
diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/CheckForMetadataProblems.java b/server/base/src/main/java/org/apache/accumulo/server/util/CheckForMetadataProblems.java
index df9900f..d437bca 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/CheckForMetadataProblems.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/CheckForMetadataProblems.java
@@ -25,17 +25,14 @@ import java.util.TreeSet;
 
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.Scanner;
-import org.apache.accumulo.core.client.impl.Writer;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.KeyExtent;
-import org.apache.accumulo.core.data.Mutation;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.metadata.MetadataTable;
+import org.apache.accumulo.core.metadata.RootTable;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection;
 import org.apache.accumulo.core.security.Authorizations;
-import org.apache.accumulo.core.security.Credentials;
-import org.apache.accumulo.core.tabletserver.thrift.ConstraintViolationException;
 import org.apache.accumulo.server.cli.ClientOpts;
 import org.apache.accumulo.server.conf.ServerConfiguration;
 import org.apache.accumulo.server.fs.VolumeManager;
@@ -46,29 +43,29 @@ import com.beust.jcommander.Parameter;
 
 public class CheckForMetadataProblems {
   private static boolean sawProblems = false;
-  
+
   public static void checkTable(String tablename, TreeSet<KeyExtent> tablets, Opts opts) throws AccumuloSecurityException {
     // sanity check of metadata table entries
     // make sure tablets has no holes, and that it starts and ends w/ null
-    
+
     if (tablets.size() == 0) {
       System.out.println("No entries found in metadata table for table " + tablename);
       sawProblems = true;
       return;
     }
-    
+
     if (tablets.first().getPrevEndRow() != null) {
       System.out.println("First entry for table " + tablename + "- " + tablets.first() + " - has non null prev end row");
       sawProblems = true;
       return;
     }
-    
+
     if (tablets.last().getEndRow() != null) {
       System.out.println("Last entry for table " + tablename + "- " + tablets.last() + " - has non null end row");
       sawProblems = true;
       return;
     }
-    
+
     Iterator<KeyExtent> tabIter = tablets.iterator();
     Text lastEndRow = tabIter.next().getEndRow();
     boolean everythingLooksGood = true;
@@ -85,13 +82,7 @@ public class CheckForMetadataProblems {
       if (broke) {
         everythingLooksGood = false;
       }
-      if (broke && opts.fix) {
-        KeyExtent ke = new KeyExtent(tabke);
-        ke.setPrevEndRow(lastEndRow);
-        MetadataTableUtil.updateTabletPrevEndRow(ke, new Credentials(opts.principal, opts.getToken()));
-        System.out.println("KE " + tabke + " has been repaired to " + ke);
-      }
-      
+
       lastEndRow = tabke.getEndRow();
     }
     if (everythingLooksGood)
@@ -99,50 +90,51 @@ public class CheckForMetadataProblems {
     else
       sawProblems = true;
   }
-  
-  public static void checkMetadataTableEntries(Opts opts, VolumeManager fs) throws Exception {
+
+  public static void checkMetadataAndRootTableEntries(String tableNameToCheck, Opts opts, VolumeManager fs) throws Exception {
+    System.out.println("Checking table: " + tableNameToCheck);
     Map<String,TreeSet<KeyExtent>> tables = new HashMap<String,TreeSet<KeyExtent>>();
-    
+
     Scanner scanner;
-    
+
     if (opts.offline) {
       scanner = new OfflineMetadataScanner(ServerConfiguration.getSystemConfiguration(opts.getInstance()), fs);
     } else {
-      scanner = opts.getConnector().createScanner(MetadataTable.NAME, Authorizations.EMPTY);
+      scanner = opts.getConnector().createScanner(tableNameToCheck, Authorizations.EMPTY);
     }
-    
+
     scanner.setRange(MetadataSchema.TabletsSection.getRange());
     TabletsSection.TabletColumnFamily.PREV_ROW_COLUMN.fetch(scanner);
     scanner.fetchColumnFamily(TabletsSection.CurrentLocationColumnFamily.NAME);
-    
+
     Text colf = new Text();
     Text colq = new Text();
     boolean justLoc = false;
-    
+
     int count = 0;
-    
+
     for (Entry<Key,Value> entry : scanner) {
       colf = entry.getKey().getColumnFamily(colf);
       colq = entry.getKey().getColumnQualifier(colq);
-      
+
       count++;
-      
+
       String tableName = (new KeyExtent(entry.getKey().getRow(), (Text) null)).getTableId().toString();
-      
+
       TreeSet<KeyExtent> tablets = tables.get(tableName);
       if (tablets == null) {
         Set<Entry<String,TreeSet<KeyExtent>>> es = tables.entrySet();
-        
+
         for (Entry<String,TreeSet<KeyExtent>> entry2 : es) {
           checkTable(entry2.getKey(), entry2.getValue(), opts);
         }
-        
+
         tables.clear();
-        
+
         tablets = new TreeSet<KeyExtent>();
         tables.put(tableName, tablets);
       }
-      
+
       if (TabletsSection.TabletColumnFamily.PREV_ROW_COLUMN.equals(colf, colq)) {
         KeyExtent tabletKe = new KeyExtent(entry.getKey().getRow(), entry.getValue());
         tablets.add(tabletKe);
@@ -151,54 +143,48 @@ public class CheckForMetadataProblems {
         if (justLoc) {
           System.out.println("Problem at key " + entry.getKey());
           sawProblems = true;
-          if (opts.fix) {
-            Writer t = MetadataTableUtil.getMetadataTable(new Credentials(opts.principal, opts.getToken()));
-            Key k = entry.getKey();
-            Mutation m = new Mutation(k.getRow());
-            m.putDelete(k.getColumnFamily(), k.getColumnQualifier());
-            try {
-              t.update(m);
-              System.out.println("Deleted " + k);
-            } catch (ConstraintViolationException e) {
-              e.printStackTrace();
-            }
-          }
         }
         justLoc = true;
       }
     }
-    
+
     if (count == 0) {
-      System.err.println("ERROR : " + MetadataTable.NAME + " table is empty");
+      System.err.println("ERROR : " + tableNameToCheck + " table is empty");
       sawProblems = true;
     }
-    
+
     Set<Entry<String,TreeSet<KeyExtent>>> es = tables.entrySet();
-    
+
     for (Entry<String,TreeSet<KeyExtent>> entry : es) {
       checkTable(entry.getKey(), entry.getValue(), opts);
     }
-    
+
+    if (!sawProblems) {
+      System.out.println("No problems found");
+    }
     // end METADATA table sanity check
   }
-  
+
   static class Opts extends ClientOpts {
-    @Parameter(names = "--fix", description = "best-effort attempt to fix problems found")
-    boolean fix = false;
-    
     @Parameter(names = "--offline", description = "perform the check on the files directly")
     boolean offline = false;
   }
-  
+
   public static void main(String[] args) throws Exception {
     Opts opts = new Opts();
     opts.parseArgs(CheckForMetadataProblems.class.getName(), args);
-    
+    Opts dummyOpts = new Opts();
+    dummyOpts.auths = opts.auths;
+    dummyOpts.password = opts.password;
+
     VolumeManager fs = VolumeManagerImpl.get();
-    checkMetadataTableEntries(opts, fs);
+
+    checkMetadataAndRootTableEntries(RootTable.NAME, dummyOpts, fs);
+    checkMetadataAndRootTableEntries(MetadataTable.NAME, opts, fs);
+    dummyOpts.stopTracing();
     opts.stopTracing();
     if (sawProblems)
       throw new RuntimeException();
   }
-  
+
 }


[2/2] git commit: ACCUMULO-2389 Removed the OfflineMetadataScanner and the offline option in the CheckForMetadataProblems.

Posted by ct...@apache.org.
ACCUMULO-2389 Removed the OfflineMetadataScanner and the offline option in the CheckForMetadataProblems.

Signed-off-by: Christopher Tubbs <ct...@apache.org>


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

Branch: refs/heads/1.6.0-SNAPSHOT
Commit: 818426c3aa87eee79df0f5d1768c0eeb24e98d4b
Parents: 0c4a956
Author: jpmcnamee <jp...@terpmail.umd.edu>
Authored: Fri Feb 21 09:50:59 2014 -0500
Committer: Christopher Tubbs <ct...@apache.org>
Committed: Wed Feb 26 16:10:54 2014 -0500

----------------------------------------------------------------------
 .../server/util/CheckForMetadataProblems.java   |  26 +-
 .../server/util/OfflineMetadataScanner.java     | 281 -------------------
 2 files changed, 5 insertions(+), 302 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/818426c3/server/base/src/main/java/org/apache/accumulo/server/util/CheckForMetadataProblems.java
----------------------------------------------------------------------
diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/CheckForMetadataProblems.java b/server/base/src/main/java/org/apache/accumulo/server/util/CheckForMetadataProblems.java
index d437bca..253b666 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/CheckForMetadataProblems.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/CheckForMetadataProblems.java
@@ -34,17 +34,14 @@ import org.apache.accumulo.core.metadata.schema.MetadataSchema;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.accumulo.server.cli.ClientOpts;
-import org.apache.accumulo.server.conf.ServerConfiguration;
 import org.apache.accumulo.server.fs.VolumeManager;
 import org.apache.accumulo.server.fs.VolumeManagerImpl;
 import org.apache.hadoop.io.Text;
 
-import com.beust.jcommander.Parameter;
-
 public class CheckForMetadataProblems {
   private static boolean sawProblems = false;
 
-  public static void checkTable(String tablename, TreeSet<KeyExtent> tablets, Opts opts) throws AccumuloSecurityException {
+  public static void checkTable(String tablename, TreeSet<KeyExtent> tablets, ClientOpts opts) throws AccumuloSecurityException {
     // sanity check of metadata table entries
     // make sure tablets has no holes, and that it starts and ends w/ null
 
@@ -91,17 +88,13 @@ public class CheckForMetadataProblems {
       sawProblems = true;
   }
 
-  public static void checkMetadataAndRootTableEntries(String tableNameToCheck, Opts opts, VolumeManager fs) throws Exception {
+  public static void checkMetadataAndRootTableEntries(String tableNameToCheck, ClientOpts opts, VolumeManager fs) throws Exception {
     System.out.println("Checking table: " + tableNameToCheck);
     Map<String,TreeSet<KeyExtent>> tables = new HashMap<String,TreeSet<KeyExtent>>();
 
     Scanner scanner;
 
-    if (opts.offline) {
-      scanner = new OfflineMetadataScanner(ServerConfiguration.getSystemConfiguration(opts.getInstance()), fs);
-    } else {
-      scanner = opts.getConnector().createScanner(tableNameToCheck, Authorizations.EMPTY);
-    }
+    scanner = opts.getConnector().createScanner(tableNameToCheck, Authorizations.EMPTY);
 
     scanner.setRange(MetadataSchema.TabletsSection.getRange());
     TabletsSection.TabletColumnFamily.PREV_ROW_COLUMN.fetch(scanner);
@@ -165,23 +158,14 @@ public class CheckForMetadataProblems {
     // end METADATA table sanity check
   }
 
-  static class Opts extends ClientOpts {
-    @Parameter(names = "--offline", description = "perform the check on the files directly")
-    boolean offline = false;
-  }
-
   public static void main(String[] args) throws Exception {
-    Opts opts = new Opts();
+    ClientOpts opts = new ClientOpts();
     opts.parseArgs(CheckForMetadataProblems.class.getName(), args);
-    Opts dummyOpts = new Opts();
-    dummyOpts.auths = opts.auths;
-    dummyOpts.password = opts.password;
 
     VolumeManager fs = VolumeManagerImpl.get();
 
-    checkMetadataAndRootTableEntries(RootTable.NAME, dummyOpts, fs);
+    checkMetadataAndRootTableEntries(RootTable.NAME, opts, fs);
     checkMetadataAndRootTableEntries(MetadataTable.NAME, opts, fs);
-    dummyOpts.stopTracing();
     opts.stopTracing();
     if (sawProblems)
       throw new RuntimeException();

http://git-wip-us.apache.org/repos/asf/accumulo/blob/818426c3/server/base/src/main/java/org/apache/accumulo/server/util/OfflineMetadataScanner.java
----------------------------------------------------------------------
diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/OfflineMetadataScanner.java b/server/base/src/main/java/org/apache/accumulo/server/util/OfflineMetadataScanner.java
deleted file mode 100644
index cdb18a5..0000000
--- a/server/base/src/main/java/org/apache/accumulo/server/util/OfflineMetadataScanner.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * 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.accumulo.server.util;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-import org.apache.accumulo.core.client.Scanner;
-import org.apache.accumulo.core.client.impl.ScannerOptions;
-import org.apache.accumulo.core.conf.AccumuloConfiguration;
-import org.apache.accumulo.core.data.Column;
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Range;
-import org.apache.accumulo.core.data.Value;
-import org.apache.accumulo.core.file.FileOperations;
-import org.apache.accumulo.core.file.FileSKVIterator;
-import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
-import org.apache.accumulo.core.iterators.system.ColumnFamilySkippingIterator;
-import org.apache.accumulo.core.iterators.system.ColumnQualifierFilter;
-import org.apache.accumulo.core.iterators.system.DeletingIterator;
-import org.apache.accumulo.core.iterators.system.MultiIterator;
-import org.apache.accumulo.core.iterators.system.VisibilityFilter;
-import org.apache.accumulo.core.iterators.user.VersioningIterator;
-import org.apache.accumulo.core.metadata.RootTable;
-import org.apache.accumulo.core.metadata.schema.MetadataSchema;
-import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.DataFileColumnFamily;
-import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.LogColumnFamily;
-import org.apache.accumulo.core.security.Authorizations;
-import org.apache.accumulo.core.tabletserver.log.LogEntry;
-import org.apache.accumulo.core.util.LocalityGroupUtil;
-import org.apache.accumulo.core.util.TextUtil;
-import org.apache.accumulo.server.client.HdfsZooInstance;
-import org.apache.accumulo.server.conf.ServerConfiguration;
-import org.apache.accumulo.server.fs.VolumeManager;
-import org.apache.accumulo.server.fs.VolumeManagerImpl;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-
-public class OfflineMetadataScanner extends ScannerOptions implements Scanner {
-  
-  private Set<String> allFiles = new HashSet<String>();
-  private Range range = new Range();
-  private final VolumeManager fs;
-  private final AccumuloConfiguration conf;
-  
-  private List<SortedKeyValueIterator<Key,Value>> openMapFiles(Collection<String> files, VolumeManager fs, AccumuloConfiguration conf) throws IOException {
-    List<SortedKeyValueIterator<Key,Value>> readers = new ArrayList<SortedKeyValueIterator<Key,Value>>();
-    for (String file : files) {
-      FileSystem ns = fs.getFileSystemByPath(new Path(file));
-      FileSKVIterator reader = FileOperations.getInstance().openReader(file, true, ns, ns.getConf(), conf);
-      readers.add(reader);
-    }
-    return readers;
-  }
-  
-  private SortedKeyValueIterator<Key,Value> createSystemIter(Range r, List<SortedKeyValueIterator<Key,Value>> readers, HashSet<Column> columns)
-      throws IOException {
-    MultiIterator multiIterator = new MultiIterator(readers, false);
-    DeletingIterator delIter = new DeletingIterator(multiIterator, false);
-    ColumnFamilySkippingIterator cfsi = new ColumnFamilySkippingIterator(delIter);
-    ColumnQualifierFilter colFilter = new ColumnQualifierFilter(cfsi, columns);
-    VisibilityFilter visFilter = new VisibilityFilter(colFilter, Authorizations.EMPTY, new byte[0]);
-    
-    visFilter.seek(r, LocalityGroupUtil.EMPTY_CF_SET, false);
-    
-    VersioningIterator vi = new VersioningIterator();
-    Map<String,String> opts = new HashMap<String,String>();
-    opts.put("maxVersions", "1");
-    vi.init(visFilter, opts, null);
-    
-    return vi;
-  }
-  
-  private static class MyEntry implements Map.Entry<Key,Value> {
-    
-    private Key k;
-    private Value v;
-    
-    MyEntry(Key k, Value v) {
-      this.k = k;
-      this.v = v;
-    }
-    
-    @Override
-    public Key getKey() {
-      return k;
-    }
-    
-    @Override
-    public Value getValue() {
-      return v;
-    }
-    
-    @Override
-    public Value setValue(Value value) {
-      throw new UnsupportedOperationException();
-    }
-    
-  }
-  
-  public OfflineMetadataScanner(AccumuloConfiguration conf, VolumeManager fs) throws IOException {
-    super();
-    this.fs = fs;
-    this.conf = conf;
-    List<LogEntry> rwal;
-    try {
-      rwal = MetadataTableUtil.getLogEntries(null, RootTable.EXTENT);
-    } catch (Exception e) {
-      throw new RuntimeException("Failed to check if root tablet has write ahead log entries", e);
-    }
-    
-    if (rwal.size() > 0) {
-      throw new RuntimeException("Root tablet has write ahead logs, can not scan offline");
-    }
-    
-    FileStatus[] rootFiles = fs.listStatus(new Path(MetadataTableUtil.getRootTabletDir()));
-    
-    for (FileStatus rootFile : rootFiles) {
-      allFiles.add(rootFile.getPath().toString());
-    }
-    
-    List<SortedKeyValueIterator<Key,Value>> readers = openMapFiles(allFiles, fs, conf);
-    
-    HashSet<Column> columns = new HashSet<Column>();
-    columns.add(new Column(TextUtil.getBytes(DataFileColumnFamily.NAME), null, null));
-    columns.add(new Column(TextUtil.getBytes(LogColumnFamily.NAME), null, null));
-    
-    SortedKeyValueIterator<Key,Value> ssi = createSystemIter(new Range(), readers, columns);
-    
-    int walogs = 0;
-    
-    while (ssi.hasTop()) {
-      if (ssi.getTopKey().compareColumnFamily(DataFileColumnFamily.NAME) == 0) {
-        allFiles.add(fs.getFullPath(ssi.getTopKey()).toString());
-      } else {
-        walogs++;
-      }
-      ssi.next();
-    }
-    
-    closeReaders(readers);
-    
-    if (walogs > 0) {
-      throw new RuntimeException("Metadata tablets have write ahead logs, can not scan offline");
-    }
-  }
-  
-  private void closeReaders(List<SortedKeyValueIterator<Key,Value>> readers) throws IOException {
-    for (SortedKeyValueIterator<Key,Value> reader : readers) {
-      ((FileSKVIterator) reader).close();
-    }
-  }
-  
-  @Override
-  public int getBatchSize() {
-    throw new UnsupportedOperationException();
-  }
-  
-  @Override
-  public Range getRange() {
-    return range;
-  }
-  
-  @Deprecated
-  @Override
-  public int getTimeOut() {
-    throw new UnsupportedOperationException();
-  }
-  
-  @Override
-  public Iterator<Entry<Key,Value>> iterator() {
-    
-    final SortedKeyValueIterator<Key,Value> ssi;
-    final List<SortedKeyValueIterator<Key,Value>> readers;
-    try {
-      readers = openMapFiles(allFiles, fs, conf);
-      ssi = createSystemIter(range, readers, new HashSet<Column>(getFetchedColumns()));
-    } catch (IOException e) {
-      throw new RuntimeException(e);
-    }
-    
-    return new Iterator<Entry<Key,Value>>() {
-      
-      @Override
-      public boolean hasNext() {
-        return ssi.hasTop() && range.contains(ssi.getTopKey());
-      }
-      
-      @Override
-      public Entry<Key,Value> next() {
-        if (!ssi.hasTop()) {
-          throw new NoSuchElementException();
-        }
-        
-        MyEntry e = new MyEntry(new Key(ssi.getTopKey()), new Value(ssi.getTopValue()));
-        try {
-          ssi.next();
-        } catch (IOException e1) {
-          throw new RuntimeException(e1);
-        }
-        return e;
-      }
-      
-      @Override
-      public void remove() {
-        throw new UnsupportedOperationException();
-      }
-      
-    };
-  }
-  
-  @Override
-  public void setBatchSize(int size) {
-    throw new UnsupportedOperationException();
-  }
-  
-  @Override
-  public void setRange(Range range) {
-    this.range = range;
-  }
-  
-  @Deprecated
-  @Override
-  public void setTimeOut(int timeOut) {
-    throw new UnsupportedOperationException();
-  }
-  
-  @Override
-  public void enableIsolation() {
-    // should always give an isolated view since it is scanning immutable files
-  }
-  
-  @Override
-  public void disableIsolation() {
-    
-  }
-  
-  public static void main(String[] args) throws IOException {
-    ServerConfiguration conf = new ServerConfiguration(HdfsZooInstance.getInstance());
-    VolumeManager fs = VolumeManagerImpl.get();
-    OfflineMetadataScanner scanner = new OfflineMetadataScanner(conf.getConfiguration(), fs);
-    scanner.setRange(MetadataSchema.TabletsSection.getRange());
-    for (Entry<Key,Value> entry : scanner)
-      System.out.println(entry.getKey() + " " + entry.getValue());
-  }
-
-  @Override
-  public long getReadaheadThreshold() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void setReadaheadThreshold(long batches) {
-    throw new UnsupportedOperationException();
-  }
-  
-}