Uploaded image for project: 'HBase'
  1. HBase
  2. HBASE-174

HBASE: Un-openable tablename bug

Details

    • Bug
    • Status: Closed
    • Critical
    • Resolution: Fixed
    • None
    • None
    • None
    • None

    Description

      If you create a table whose name is the beginning of an already existing table name, you will not be able to open the table.

      Try:
      1) Create table TESTOne
      2) Create table TEST
      3) Open table TEST

      The reason is that the the META keys augment the table name with [regionID]. So when looking up table TEST, a scanner is opened on the HMemCache Meta region with a start key of "TEST". But the HMemcacheScanner backingMaps (TreeMaps) are keyed with the augmented table names where TESTOne[regionid1] comes before TEST_[regionid2] because 'O' is lower than _ in the ASCII table. The backingMaps[i].tailMap(firstKey).keySet().iterator() line in HMemCache returns an iterator starting from TestOne_... and not Test_... like it should.

      The "if(!regionInfo.tableDesc.getName().equals(tableName)) {" line in HClient will cause the method to stop searching for more regions of that table and the number of found tables for tableName will be 0. Incidentally that IF statement will report "table found" even when that is not the case.

      Attachments

        1. hadoop-1581.patch
          7 kB
          Michael Stack
        2. hadoop-1581-2.patch
          7 kB
          Michael Stack
        3. hadoop-1581-v3.patch
          5 kB
          Michael Stack

        Activity

          stack Michael Stack added a comment -

          Suggested fix for this issue.

          HADOOP-1581 HBASE: Un-openable tablename bug
          Change format of region names from TABLENAME_STARTROW_ENDROW-RANDOMID
          to TABLENAME,STARTROW,ENDROW-RANDOMID. Makes it so lone table name will
          sort before any region of said table.
          M src/contrib/hbase/src/test/hbase-site.xml
          (hbase.client.retries.number): Removed. Wasdefault value for this property.
          (hbase.master.meta.thread.rescanfrequency,
          hbase.server.thread.wakefrequency,
          hbase.regionserver.handler.count): Add values that are less than
          default so unit tests are even more responsive (and finished
          quicker).
          M src/contrib/hbase/src/test/org/apache/hadoop/hbase/TestToString.java
          Change test so it expects region info name that has ',' delimiters
          rather than '_' delimiters.

          • src/contrib/hbase/src/test/org/apache/hadoop/hbase/TestTable.java
            Rename testTable as testCreateTable.
            (testTableNameClash): Test for this issue.
          • src/contrib/hbase/src/java/org/apache/hadoop/hbase/HTableDescriptor.java
            Comment on table name sorting.
          • src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionInfo.java
            Change format of region names so delimiter is ',' rather than '_'.
          stack Michael Stack added a comment - Suggested fix for this issue. HADOOP-1581 HBASE: Un-openable tablename bug Change format of region names from TABLENAME_STARTROW_ENDROW-RANDOMID to TABLENAME,STARTROW,ENDROW-RANDOMID. Makes it so lone table name will sort before any region of said table. M src/contrib/hbase/src/test/hbase-site.xml (hbase.client.retries.number): Removed. Wasdefault value for this property. (hbase.master.meta.thread.rescanfrequency, hbase.server.thread.wakefrequency, hbase.regionserver.handler.count): Add values that are less than default so unit tests are even more responsive (and finished quicker). M src/contrib/hbase/src/test/org/apache/hadoop/hbase/TestToString.java Change test so it expects region info name that has ',' delimiters rather than '_' delimiters. src/contrib/hbase/src/test/org/apache/hadoop/hbase/TestTable.java Rename testTable as testCreateTable. (testTableNameClash): Test for this issue. src/contrib/hbase/src/java/org/apache/hadoop/hbase/HTableDescriptor.java Comment on table name sorting. src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionInfo.java Change format of region names so delimiter is ',' rather than '_'.
          stack Michael Stack added a comment -

          Version 2 adds fix for "Incidentally that IF statement will report "table found" even when that is not the case."

          stack Michael Stack added a comment - Version 2 adds fix for "Incidentally that IF statement will report "table found" even when that is not the case."
          stack Michael Stack added a comment -

          Version that will apply after hadoop-1574 commit

          stack Michael Stack added a comment - Version that will apply after hadoop-1574 commit
          stack Michael Stack added a comment -

          Builds and passes all tests locally. Trying on hudson.

          stack Michael Stack added a comment - Builds and passes all tests locally. Trying on hudson.
          hadoopqa Hadoop QA added a comment - +1 http://issues.apache.org/jira/secure/attachment/12361839/hadoop-1581-v3.patch applied and successfully tested against trunk revision r556335. Test results: http://lucene.zones.apache.org:8080/hudson/job/Hadoop-Patch/414/testReport/ Console output: http://lucene.zones.apache.org:8080/hudson/job/Hadoop-Patch/414/console
          stack Michael Stack added a comment -

          Committed.

          stack Michael Stack added a comment - Committed.
          jimk Jim Kellerman added a comment -

          Rather than extracting the table name from the region name, why not get it from the HRegionInfo since it contains the HTableDescriptor which has the name of the table in it?

          static Text getRegionName(HRegionInfo info) {
          return info.getTableDesc().getName();
          }

          or is it the case that all you have is the region name and not the HRegionInfo?

          jimk Jim Kellerman added a comment - Rather than extracting the table name from the region name, why not get it from the HRegionInfo since it contains the HTableDescriptor which has the name of the table in it? static Text getRegionName(HRegionInfo info) { return info.getTableDesc().getName(); } or is it the case that all you have is the region name and not the HRegionInfo?
          stack Michael Stack added a comment -

          I only have the name (Its used parsing meta table rows).

          stack Michael Stack added a comment - I only have the name (Its used parsing meta table rows).
          jimk Jim Kellerman added a comment -

          Ok, now that I see the context in which it is being used (comparing a row key to a table name), I understand why you can't do what I suggested in the previous comment.

          Closing issue.

          jimk Jim Kellerman added a comment - Ok, now that I see the context in which it is being used (comparing a row key to a table name), I understand why you can't do what I suggested in the previous comment. Closing issue.

          People

            Unassigned Unassigned
            james.kennedy James Kennedy
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: