You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hbase.apache.org by Ted Yu <yu...@gmail.com> on 2010/11/25 00:45:06 UTC

code review: HBASE-3251

Hi,
I wanted to automate the manual deletion of dangling row(s) in .META. table.
Please kindly comment on the following modification to HMaster.createTable()
which is base on 0.20.6 codebase:

    long scannerid = srvr.openScanner(metaRegionName, scan);
    try {
        HashSet<byte[]> regions = new HashSet<byte[]>();
        boolean cleanTable = false,        // whether the table has a row in
.META. whose start key is empty
                exists = false;
        Result data = srvr.next(scannerid);
        while (data != null) {
            if (data != null && data.size() > 0) {
                HRegionInfo info = Writables.getHRegionInfo(
                        data.getValue(CATALOG_FAMILY,
REGIONINFO_QUALIFIER));
                if (info.getTableDesc().getNameAsString().equals(tableName))
{
                    exists = true;
                    if (info.getStartKey().length == 0) {
                        cleanTable = true;
                    } else {
                        regions.add(info.getRegionName());
                    }
                }
            }
            data = srvr.next(scannerid);
        }
        if (exists) {
            if (!cleanTable) {
                HTable meta = new HTable(HConstants.META_TABLE_NAME);
                for (byte[] region : regions) {
                    Delete d = new Delete(region);
                    meta.delete(d);
                    LOG.info("dangling row " + Bytes.toString(region) + "
deleted from .META.");
                }
            } else {
                // A region for this table already exists. Ergo table
exists.
                throw new TableExistsException(tableName);
            }
        }
    } finally {
      srvr.close(scannerid);
    }

Thanks

Re: code review: HBASE-3251

Posted by Ted Yu <yu...@gmail.com>.
I am not that familiar with 0.90/trunk code. Looking at
MetaReader.tableExists(), existence check logic hasn't changed from 0.20.6
Once 0.90 RC1 comes out, I will deploy onto our dev cluster.

Here is the diff.

tyumac:external tyu$ diff
hbase-0.20.6/src/java/org/apache/hadoop/hbase/master/HMaster.java
~/hbase-0.20.6/src/java/org/apache/hadoop/hbase/master/HMaster.java
27a28
> import java.util.HashSet;
61a63
> import org.apache.hadoop.hbase.client.Delete;
63a66
> import org.apache.hadoop.hbase.client.HTable;
798,806c796,827
<       Result data = srvr.next(scannerid);
<       if (data != null && data.size() > 0) {
<         HRegionInfo info = Writables.getHRegionInfo(
<             data.getValue(CATALOG_FAMILY, REGIONINFO_QUALIFIER));
<         if (info.getTableDesc().getNameAsString().equals(tableName)) {
<           // A region for this table already exists. Ergo table exists.
<           throw new TableExistsException(tableName);
<         }
<       }
---
>       HashSet<byte[]> regions = new HashSet<byte[]>();
>       boolean cleanTable = false,             // whether the table has a
row in .META. whose start key is empty
>                       exists = false;
>       Result data = srvr.next(scannerid);
>       while (data != null) {
>               if (data != null && data.size() > 0) {
>                       HRegionInfo info = Writables.getHRegionInfo(
>                                       data.getValue(CATALOG_FAMILY,
REGIONINFO_QUALIFIER));
>                       if
(info.getTableDesc().getNameAsString().equals(tableName)) {
>                               exists = true;
>                               if (info.getStartKey().length == 0) {
>                                       cleanTable = true;
>                               } else {
>                                       regions.add(info.getRegionName());
>                               }
>                       }
>               }
>               data = srvr.next(scannerid);
>       }
>       if (exists) {
>               if (!cleanTable) {
>                               HTable meta = new
HTable(HConstants.META_TABLE_NAME);
>                       for (byte[] region : regions) {
>                                       Delete d = new Delete(region);
>                                       meta.delete(d);
>                                       LOG.info("dangling row " +
Bytes.toString(region) + " deleted from .META.");
>                       }
>               } else {
>                               // A region for this table already exists.
Ergo table exists.
>                               throw new
TableExistsException(tableName);
>               }
>       }
1109a1131,1135
>       if (null == infoMap) {
>         LOG.warn(Bytes.toString(CATALOG_FAMILY) + ":" +
>                 Bytes.toString(REGIONINFO_QUALIFIER) + " is empty for row:
" +
>                 Bytes.toString(row));
>       }

On Wed, Nov 24, 2010 at 3:47 PM, Ryan Rawson <ry...@gmail.com> wrote:

> Please include a diff instead, it's hard to compare.
>
> Also I'm not sure there will be a 0.20.7.
>
> -ryan
>
> On Wed, Nov 24, 2010 at 3:45 PM, Ted Yu <yu...@gmail.com> wrote:
> > Hi,
> > I wanted to automate the manual deletion of dangling row(s) in .META.
> table.
> > Please kindly comment on the following modification to
> HMaster.createTable()
> > which is base on 0.20.6 codebase:
> >
> >    long scannerid = srvr.openScanner(metaRegionName, scan);
> >    try {
> >        HashSet<byte[]> regions = new HashSet<byte[]>();
> >        boolean cleanTable = false,        // whether the table has a row
> in
> > .META. whose start key is empty
> >                exists = false;
> >        Result data = srvr.next(scannerid);
> >        while (data != null) {
> >            if (data != null && data.size() > 0) {
> >                HRegionInfo info = Writables.getHRegionInfo(
> >                        data.getValue(CATALOG_FAMILY,
> > REGIONINFO_QUALIFIER));
> >                if
> (info.getTableDesc().getNameAsString().equals(tableName))
> > {
> >                    exists = true;
> >                    if (info.getStartKey().length == 0) {
> >                        cleanTable = true;
> >                    } else {
> >                        regions.add(info.getRegionName());
> >                    }
> >                }
> >            }
> >            data = srvr.next(scannerid);
> >        }
> >        if (exists) {
> >            if (!cleanTable) {
> >                HTable meta = new HTable(HConstants.META_TABLE_NAME);
> >                for (byte[] region : regions) {
> >                    Delete d = new Delete(region);
> >                    meta.delete(d);
> >                    LOG.info("dangling row " + Bytes.toString(region) + "
> > deleted from .META.");
> >                }
> >            } else {
> >                // A region for this table already exists. Ergo table
> > exists.
> >                throw new TableExistsException(tableName);
> >            }
> >        }
> >    } finally {
> >      srvr.close(scannerid);
> >    }
> >
> > Thanks
> >
>

Re: code review: HBASE-3251

Posted by Ryan Rawson <ry...@gmail.com>.
Please include a diff instead, it's hard to compare.

Also I'm not sure there will be a 0.20.7.

-ryan

On Wed, Nov 24, 2010 at 3:45 PM, Ted Yu <yu...@gmail.com> wrote:
> Hi,
> I wanted to automate the manual deletion of dangling row(s) in .META. table.
> Please kindly comment on the following modification to HMaster.createTable()
> which is base on 0.20.6 codebase:
>
>    long scannerid = srvr.openScanner(metaRegionName, scan);
>    try {
>        HashSet<byte[]> regions = new HashSet<byte[]>();
>        boolean cleanTable = false,        // whether the table has a row in
> .META. whose start key is empty
>                exists = false;
>        Result data = srvr.next(scannerid);
>        while (data != null) {
>            if (data != null && data.size() > 0) {
>                HRegionInfo info = Writables.getHRegionInfo(
>                        data.getValue(CATALOG_FAMILY,
> REGIONINFO_QUALIFIER));
>                if (info.getTableDesc().getNameAsString().equals(tableName))
> {
>                    exists = true;
>                    if (info.getStartKey().length == 0) {
>                        cleanTable = true;
>                    } else {
>                        regions.add(info.getRegionName());
>                    }
>                }
>            }
>            data = srvr.next(scannerid);
>        }
>        if (exists) {
>            if (!cleanTable) {
>                HTable meta = new HTable(HConstants.META_TABLE_NAME);
>                for (byte[] region : regions) {
>                    Delete d = new Delete(region);
>                    meta.delete(d);
>                    LOG.info("dangling row " + Bytes.toString(region) + "
> deleted from .META.");
>                }
>            } else {
>                // A region for this table already exists. Ergo table
> exists.
>                throw new TableExistsException(tableName);
>            }
>        }
>    } finally {
>      srvr.close(scannerid);
>    }
>
> Thanks
>