diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/migration/NamespaceUpgrade.java hbase-server/src/main/java/org/apache/hadoop/hbase/migration/NamespaceUpgrade.java index 2245946..46aaaec 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/migration/NamespaceUpgrade.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/migration/NamespaceUpgrade.java @@ -32,6 +32,8 @@ import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.PathFilter; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HTableDescriptor; @@ -39,6 +41,10 @@ import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.catalog.MetaEditor; +import org.apache.hadoop.hbase.client.Delete; +import org.apache.hadoop.hbase.client.Get; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.exceptions.DeserializationException; import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.regionserver.HRegionFileSystem; @@ -400,10 +406,7 @@ public class NamespaceUpgrade implements Tool { oldDesc, null); region.initialize(); - //Run major compaction to archive old stores - //to keep any snapshots to _acl_ unbroken - region.compactStores(true); - region.waitForFlushesAndCompactions(); + updateAcls(region); region.close(); //Create new region dir @@ -443,6 +446,26 @@ public class NamespaceUpgrade implements Tool { } } + /** + * Deletes the old _acl_ entry, and inserts a new one using namespace. + * @param region + * @throws IOException + */ + private void updateAcls(HRegion region) throws IOException { + byte[] rowKey = Bytes.toBytes(NamespaceUpgrade.OLD_ACL); + Get g = new Get(rowKey); + Result r = region.get(g); + Put p = new Put(AccessControlLists.ACL_TABLE_NAME.getName()); + Delete del = new Delete(rowKey); + if (r == null || r.size() == 0) return; + for (Cell c : r.rawCells()) { + // create a delete object, and put for new. + p.add(CellUtil.cloneFamily(c), CellUtil.cloneQualifier(c), CellUtil.cloneValue(c)); + } + region.delete(del); + region.put(p); + } + //Culled from FSTableDescriptors private static HTableDescriptor readTableDescriptor(FileSystem fs, FileStatus status) throws IOException {