http://git-wip-us.apache.org/repos/asf/hbase-site/blob/29e33858/xref-test/org/apache/hadoop/hbase/util/TestHBaseFsckOneRS.html ---------------------------------------------------------------------- diff --git a/xref-test/org/apache/hadoop/hbase/util/TestHBaseFsckOneRS.html b/xref-test/org/apache/hadoop/hbase/util/TestHBaseFsckOneRS.html index b67c98d..5d8e127 100644 --- a/xref-test/org/apache/hadoop/hbase/util/TestHBaseFsckOneRS.html +++ b/xref-test/org/apache/hadoop/hbase/util/TestHBaseFsckOneRS.html @@ -590,1238 +590,1262 @@ <a class="jxr_linenumber" name="580" href="#580">580</a> } <a class="jxr_linenumber" name="581" href="#581">581</a> } <a class="jxr_linenumber" name="582" href="#582">582</a> -<a class="jxr_linenumber" name="583" href="#583">583</a> @Test (timeout=180000) -<a class="jxr_linenumber" name="584" href="#584">584</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testHbckAfterRegionMerge() <strong class="jxr_keyword">throws</strong> Exception { -<a class="jxr_linenumber" name="585" href="#585">585</a> TableName table = TableName.valueOf(<span class="jxr_string">"testMergeRegionFilesInHdfs"</span>); -<a class="jxr_linenumber" name="586" href="#586">586</a> Table meta = <strong class="jxr_keyword">null</strong>; -<a class="jxr_linenumber" name="587" href="#587">587</a> <strong class="jxr_keyword">try</strong> { -<a class="jxr_linenumber" name="588" href="#588">588</a> <em class="jxr_comment">// disable CatalogJanitor</em> -<a class="jxr_linenumber" name="589" href="#589">589</a> TEST_UTIL.getHBaseCluster().getMaster().setCatalogJanitorEnabled(false); -<a class="jxr_linenumber" name="590" href="#590">590</a> setupTable(table); -<a class="jxr_linenumber" name="591" href="#591">591</a> assertEquals(ROWKEYS.length, countRows()); -<a class="jxr_linenumber" name="592" href="#592">592</a> -<a class="jxr_linenumber" name="593" href="#593">593</a> <strong class="jxr_keyword">try</strong>(RegionLocator rl = connection.getRegionLocator(tbl.getName())) { -<a class="jxr_linenumber" name="594" href="#594">594</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> -<a class="jxr_linenumber" name="595" href="#595">595</a> admin.flush(table); -<a class="jxr_linenumber" name="596" href="#596">596</a> HRegionInfo region1 = rl.getRegionLocation(Bytes.toBytes(<span class="jxr_string">"A"</span>)).getRegionInfo(); -<a class="jxr_linenumber" name="597" href="#597">597</a> HRegionInfo region2 = rl.getRegionLocation(Bytes.toBytes(<span class="jxr_string">"B"</span>)).getRegionInfo(); -<a class="jxr_linenumber" name="598" href="#598">598</a> -<a class="jxr_linenumber" name="599" href="#599">599</a> <strong class="jxr_keyword">int</strong> regionCountBeforeMerge = rl.getAllRegionLocations().size(); -<a class="jxr_linenumber" name="600" href="#600">600</a> -<a class="jxr_linenumber" name="601" href="#601">601</a> assertNotEquals(region1, region2); -<a class="jxr_linenumber" name="602" href="#602">602</a> -<a class="jxr_linenumber" name="603" href="#603">603</a> <em class="jxr_comment">// do a region merge</em> -<a class="jxr_linenumber" name="604" href="#604">604</a> admin.mergeRegions(region1.getEncodedNameAsBytes(), region2.getEncodedNameAsBytes(), false); -<a class="jxr_linenumber" name="605" href="#605">605</a> -<a class="jxr_linenumber" name="606" href="#606">606</a> <em class="jxr_comment">// wait until region merged</em> -<a class="jxr_linenumber" name="607" href="#607">607</a> <strong class="jxr_keyword">long</strong> timeout = System.currentTimeMillis() + 30 * 1000; -<a class="jxr_linenumber" name="608" href="#608">608</a> <strong class="jxr_keyword">while</strong> (<strong class="jxr_keyword">true</strong>) { -<a class="jxr_linenumber" name="609" href="#609">609</a> <strong class="jxr_keyword">if</strong> (rl.getAllRegionLocations().size() < regionCountBeforeMerge) { -<a class="jxr_linenumber" name="610" href="#610">610</a> <strong class="jxr_keyword">break</strong>; -<a class="jxr_linenumber" name="611" href="#611">611</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (System.currentTimeMillis() > timeout) { -<a class="jxr_linenumber" name="612" href="#612">612</a> fail(<span class="jxr_string">"Time out waiting on region "</span> + region1.getEncodedName() + <span class="jxr_string">" and "</span> + region2 -<a class="jxr_linenumber" name="613" href="#613">613</a> .getEncodedName() + <span class="jxr_string">" be merged"</span>); -<a class="jxr_linenumber" name="614" href="#614">614</a> } -<a class="jxr_linenumber" name="615" href="#615">615</a> Thread.sleep(10); -<a class="jxr_linenumber" name="616" href="#616">616</a> } -<a class="jxr_linenumber" name="617" href="#617">617</a> -<a class="jxr_linenumber" name="618" href="#618">618</a> assertEquals(ROWKEYS.length, countRows()); -<a class="jxr_linenumber" name="619" href="#619">619</a> -<a class="jxr_linenumber" name="620" href="#620">620</a> HBaseFsck hbck = doFsck(conf, false); -<a class="jxr_linenumber" name="621" href="#621">621</a> assertNoErrors(hbck); <em class="jxr_comment">// no errors</em> -<a class="jxr_linenumber" name="622" href="#622">622</a> } -<a class="jxr_linenumber" name="623" href="#623">623</a> -<a class="jxr_linenumber" name="624" href="#624">624</a> } <strong class="jxr_keyword">finally</strong> { -<a class="jxr_linenumber" name="625" href="#625">625</a> TEST_UTIL.getHBaseCluster().getMaster().setCatalogJanitorEnabled(<strong class="jxr_keyword">true</strong>); -<a class="jxr_linenumber" name="626" href="#626">626</a> cleanupTable(table); -<a class="jxr_linenumber" name="627" href="#627">627</a> IOUtils.closeQuietly(meta); -<a class="jxr_linenumber" name="628" href="#628">628</a> } -<a class="jxr_linenumber" name="629" href="#629">629</a> } -<a class="jxr_linenumber" name="630" href="#630">630</a> <em class="jxr_javadoccomment">/**</em> -<a class="jxr_linenumber" name="631" href="#631">631</a> <em class="jxr_javadoccomment"> * This creates entries in hbase:meta with no hdfs data. This should cleanly</em> -<a class="jxr_linenumber" name="632" href="#632">632</a> <em class="jxr_javadoccomment"> * remove the table.</em> -<a class="jxr_linenumber" name="633" href="#633">633</a> <em class="jxr_javadoccomment"> */</em> -<a class="jxr_linenumber" name="634" href="#634">634</a> @Test (timeout=180000) -<a class="jxr_linenumber" name="635" href="#635">635</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testNoHdfsTable() <strong class="jxr_keyword">throws</strong> Exception { -<a class="jxr_linenumber" name="636" href="#636">636</a> TableName table = TableName.valueOf(<span class="jxr_string">"NoHdfsTable"</span>); -<a class="jxr_linenumber" name="637" href="#637">637</a> setupTable(table); -<a class="jxr_linenumber" name="638" href="#638">638</a> assertEquals(ROWKEYS.length, countRows()); -<a class="jxr_linenumber" name="639" href="#639">639</a> -<a class="jxr_linenumber" name="640" href="#640">640</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> -<a class="jxr_linenumber" name="641" href="#641">641</a> admin.flush(table); -<a class="jxr_linenumber" name="642" href="#642">642</a> -<a class="jxr_linenumber" name="643" href="#643">643</a> <em class="jxr_comment">// Mess it up by deleting hdfs dirs</em> -<a class="jxr_linenumber" name="644" href="#644">644</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">""</span>), -<a class="jxr_linenumber" name="645" href="#645">645</a> Bytes.toBytes(<span class="jxr_string">"A"</span>), false, false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> -<a class="jxr_linenumber" name="646" href="#646">646</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"A"</span>), -<a class="jxr_linenumber" name="647" href="#647">647</a> Bytes.toBytes(<span class="jxr_string">"B"</span>), false, false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> -<a class="jxr_linenumber" name="648" href="#648">648</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"B"</span>), -<a class="jxr_linenumber" name="649" href="#649">649</a> Bytes.toBytes(<span class="jxr_string">"C"</span>), false, false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> -<a class="jxr_linenumber" name="650" href="#650">650</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"C"</span>), -<a class="jxr_linenumber" name="651" href="#651">651</a> Bytes.toBytes(<span class="jxr_string">""</span>), false, false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> -<a class="jxr_linenumber" name="652" href="#652">652</a> -<a class="jxr_linenumber" name="653" href="#653">653</a> <em class="jxr_comment">// also remove the table directory in hdfs</em> -<a class="jxr_linenumber" name="654" href="#654">654</a> deleteTableDir(table); -<a class="jxr_linenumber" name="655" href="#655">655</a> -<a class="jxr_linenumber" name="656" href="#656">656</a> HBaseFsck hbck = doFsck(conf, false); -<a class="jxr_linenumber" name="657" href="#657">657</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] {HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS, -<a class="jxr_linenumber" name="658" href="#658">658</a> HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS, HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS, -<a class="jxr_linenumber" name="659" href="#659">659</a> HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS, HBaseFsck.ErrorReporter.ERROR_CODE.ORPHAN_TABLE_STATE, }); -<a class="jxr_linenumber" name="660" href="#660">660</a> <em class="jxr_comment">// holes are separate from overlap groups</em> -<a class="jxr_linenumber" name="661" href="#661">661</a> assertEquals(0, hbck.getOverlapGroups(table).size()); -<a class="jxr_linenumber" name="662" href="#662">662</a> -<a class="jxr_linenumber" name="663" href="#663">663</a> <em class="jxr_comment">// fix hole</em> -<a class="jxr_linenumber" name="664" href="#664">664</a> doFsck(conf, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// detect dangling regions and remove those</em> -<a class="jxr_linenumber" name="665" href="#665">665</a> -<a class="jxr_linenumber" name="666" href="#666">666</a> <em class="jxr_comment">// check that hole fixed</em> -<a class="jxr_linenumber" name="667" href="#667">667</a> assertNoErrors(doFsck(conf,false)); -<a class="jxr_linenumber" name="668" href="#668">668</a> assertFalse(<span class="jxr_string">"Table "</span> + table + <span class="jxr_string">" should have been deleted"</span>, admin.tableExists(table)); -<a class="jxr_linenumber" name="669" href="#669">669</a> } -<a class="jxr_linenumber" name="670" href="#670">670</a> -<a class="jxr_linenumber" name="671" href="#671">671</a> <em class="jxr_javadoccomment">/**</em> -<a class="jxr_linenumber" name="672" href="#672">672</a> <em class="jxr_javadoccomment"> * when the hbase.version file missing, It is fix the fault.</em> -<a class="jxr_linenumber" name="673" href="#673">673</a> <em class="jxr_javadoccomment"> */</em> -<a class="jxr_linenumber" name="674" href="#674">674</a> @Test (timeout=180000) -<a class="jxr_linenumber" name="675" href="#675">675</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testNoVersionFile() <strong class="jxr_keyword">throws</strong> Exception { -<a class="jxr_linenumber" name="676" href="#676">676</a> <em class="jxr_comment">// delete the hbase.version file</em> -<a class="jxr_linenumber" name="677" href="#677">677</a> Path rootDir = FSUtils.getRootDir(conf); -<a class="jxr_linenumber" name="678" href="#678">678</a> FileSystem fs = rootDir.getFileSystem(conf); -<a class="jxr_linenumber" name="679" href="#679">679</a> Path versionFile = <strong class="jxr_keyword">new</strong> Path(rootDir, HConstants.VERSION_FILE_NAME); -<a class="jxr_linenumber" name="680" href="#680">680</a> fs.delete(versionFile, <strong class="jxr_keyword">true</strong>); -<a class="jxr_linenumber" name="681" href="#681">681</a> -<a class="jxr_linenumber" name="682" href="#682">682</a> <em class="jxr_comment">// test</em> -<a class="jxr_linenumber" name="683" href="#683">683</a> HBaseFsck hbck = doFsck(conf, false); -<a class="jxr_linenumber" name="684" href="#684">684</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.NO_VERSION_FILE }); -<a class="jxr_linenumber" name="685" href="#685">685</a> <em class="jxr_comment">// fix hbase.version missing</em> -<a class="jxr_linenumber" name="686" href="#686">686</a> doFsck(conf, <strong class="jxr_keyword">true</strong>); -<a class="jxr_linenumber" name="687" href="#687">687</a> -<a class="jxr_linenumber" name="688" href="#688">688</a> <em class="jxr_comment">// no version file fixed</em> -<a class="jxr_linenumber" name="689" href="#689">689</a> assertNoErrors(doFsck(conf, false)); -<a class="jxr_linenumber" name="690" href="#690">690</a> } -<a class="jxr_linenumber" name="691" href="#691">691</a> -<a class="jxr_linenumber" name="692" href="#692">692</a> @Test (timeout=180000) -<a class="jxr_linenumber" name="693" href="#693">693</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testNoTableState() <strong class="jxr_keyword">throws</strong> Exception { -<a class="jxr_linenumber" name="694" href="#694">694</a> <em class="jxr_comment">// delete the hbase.version file</em> -<a class="jxr_linenumber" name="695" href="#695">695</a> TableName table = -<a class="jxr_linenumber" name="696" href="#696">696</a> TableName.valueOf(<span class="jxr_string">"testNoTableState"</span>); -<a class="jxr_linenumber" name="697" href="#697">697</a> <strong class="jxr_keyword">try</strong> { -<a class="jxr_linenumber" name="698" href="#698">698</a> setupTable(table); -<a class="jxr_linenumber" name="699" href="#699">699</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> -<a class="jxr_linenumber" name="700" href="#700">700</a> admin.flush(table); -<a class="jxr_linenumber" name="701" href="#701">701</a> -<a class="jxr_linenumber" name="702" href="#702">702</a> MetaTableAccessor.deleteTableState(TEST_UTIL.getConnection(), table); -<a class="jxr_linenumber" name="703" href="#703">703</a> -<a class="jxr_linenumber" name="704" href="#704">704</a> <em class="jxr_comment">// test</em> -<a class="jxr_linenumber" name="705" href="#705">705</a> HBaseFsck hbck = doFsck(conf, false); -<a class="jxr_linenumber" name="706" href="#706">706</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.NO_TABLE_STATE }); -<a class="jxr_linenumber" name="707" href="#707">707</a> <em class="jxr_comment">// fix table state missing</em> -<a class="jxr_linenumber" name="708" href="#708">708</a> doFsck(conf, <strong class="jxr_keyword">true</strong>); -<a class="jxr_linenumber" name="709" href="#709">709</a> -<a class="jxr_linenumber" name="710" href="#710">710</a> assertNoErrors(doFsck(conf, false)); -<a class="jxr_linenumber" name="711" href="#711">711</a> assertTrue(TEST_UTIL.getHBaseAdmin().isTableEnabled(table)); -<a class="jxr_linenumber" name="712" href="#712">712</a> } <strong class="jxr_keyword">finally</strong> { -<a class="jxr_linenumber" name="713" href="#713">713</a> cleanupTable(table); -<a class="jxr_linenumber" name="714" href="#714">714</a> } -<a class="jxr_linenumber" name="715" href="#715">715</a> } -<a class="jxr_linenumber" name="716" href="#716">716</a> -<a class="jxr_linenumber" name="717" href="#717">717</a> <em class="jxr_javadoccomment">/**</em> -<a class="jxr_linenumber" name="718" href="#718">718</a> <em class="jxr_javadoccomment"> * This creates two tables and mess both of them and fix them one by one</em> -<a class="jxr_linenumber" name="719" href="#719">719</a> <em class="jxr_javadoccomment"> */</em> -<a class="jxr_linenumber" name="720" href="#720">720</a> @Test (timeout=180000) -<a class="jxr_linenumber" name="721" href="#721">721</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testFixByTable() <strong class="jxr_keyword">throws</strong> Exception { -<a class="jxr_linenumber" name="722" href="#722">722</a> TableName table1 = -<a class="jxr_linenumber" name="723" href="#723">723</a> TableName.valueOf(<span class="jxr_string">"testFixByTable1"</span>); -<a class="jxr_linenumber" name="724" href="#724">724</a> TableName table2 = -<a class="jxr_linenumber" name="725" href="#725">725</a> TableName.valueOf(<span class="jxr_string">"testFixByTable2"</span>); -<a class="jxr_linenumber" name="726" href="#726">726</a> <strong class="jxr_keyword">try</strong> { -<a class="jxr_linenumber" name="727" href="#727">727</a> setupTable(table1); -<a class="jxr_linenumber" name="728" href="#728">728</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> -<a class="jxr_linenumber" name="729" href="#729">729</a> admin.flush(table1); -<a class="jxr_linenumber" name="730" href="#730">730</a> <em class="jxr_comment">// Mess them up by leaving a hole in the hdfs data</em> -<a class="jxr_linenumber" name="731" href="#731">731</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"B"</span>), -<a class="jxr_linenumber" name="732" href="#732">732</a> Bytes.toBytes(<span class="jxr_string">"C"</span>), false, false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> +<a class="jxr_linenumber" name="583" href="#583">583</a> <em class="jxr_javadoccomment">/**</em> +<a class="jxr_linenumber" name="584" href="#584">584</a> <em class="jxr_javadoccomment"> * test region boundaries and make sure store file had been created.</em> +<a class="jxr_linenumber" name="585" href="#585">585</a> <em class="jxr_javadoccomment"> * @throws Exception</em> +<a class="jxr_linenumber" name="586" href="#586">586</a> <em class="jxr_javadoccomment"> */</em> +<a class="jxr_linenumber" name="587" href="#587">587</a> @Test(timeout = 180000) +<a class="jxr_linenumber" name="588" href="#588">588</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testRegionBoundariesCheckWithFlushTable() <strong class="jxr_keyword">throws</strong> Exception { +<a class="jxr_linenumber" name="589" href="#589">589</a> HBaseFsck hbck = doFsck(conf, false); +<a class="jxr_linenumber" name="590" href="#590">590</a> assertNoErrors(hbck); <em class="jxr_comment">// no errors</em> +<a class="jxr_linenumber" name="591" href="#591">591</a> TableName table = TableName.valueOf(<span class="jxr_string">"testRegionBoundariesCheckWithFlushTable"</span>); +<a class="jxr_linenumber" name="592" href="#592">592</a> <strong class="jxr_keyword">try</strong> { +<a class="jxr_linenumber" name="593" href="#593">593</a> setupTable(table); +<a class="jxr_linenumber" name="594" href="#594">594</a> admin.flush(table); +<a class="jxr_linenumber" name="595" href="#595">595</a> hbck.connect(); <em class="jxr_comment">// need connection to have access to META</em> +<a class="jxr_linenumber" name="596" href="#596">596</a> hbck.checkRegionBoundaries(); +<a class="jxr_linenumber" name="597" href="#597">597</a> assertNoErrors(hbck); <em class="jxr_comment">// no errors</em> +<a class="jxr_linenumber" name="598" href="#598">598</a> } <strong class="jxr_keyword">catch</strong> (IllegalArgumentException e) { +<a class="jxr_linenumber" name="599" href="#599">599</a> <strong class="jxr_keyword">if</strong> (e.getMessage().endsWith(<span class="jxr_string">"not a valid DFS filename."</span>)) { +<a class="jxr_linenumber" name="600" href="#600">600</a> fail(<span class="jxr_string">"Table directory path is not valid."</span> + e.getMessage()); +<a class="jxr_linenumber" name="601" href="#601">601</a> } +<a class="jxr_linenumber" name="602" href="#602">602</a> } <strong class="jxr_keyword">finally</strong> { +<a class="jxr_linenumber" name="603" href="#603">603</a> hbck.close(); +<a class="jxr_linenumber" name="604" href="#604">604</a> } +<a class="jxr_linenumber" name="605" href="#605">605</a> } +<a class="jxr_linenumber" name="606" href="#606">606</a> +<a class="jxr_linenumber" name="607" href="#607">607</a> @Test (timeout=180000) +<a class="jxr_linenumber" name="608" href="#608">608</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testHbckAfterRegionMerge() <strong class="jxr_keyword">throws</strong> Exception { +<a class="jxr_linenumber" name="609" href="#609">609</a> TableName table = TableName.valueOf(<span class="jxr_string">"testMergeRegionFilesInHdfs"</span>); +<a class="jxr_linenumber" name="610" href="#610">610</a> Table meta = <strong class="jxr_keyword">null</strong>; +<a class="jxr_linenumber" name="611" href="#611">611</a> <strong class="jxr_keyword">try</strong> { +<a class="jxr_linenumber" name="612" href="#612">612</a> <em class="jxr_comment">// disable CatalogJanitor</em> +<a class="jxr_linenumber" name="613" href="#613">613</a> TEST_UTIL.getHBaseCluster().getMaster().setCatalogJanitorEnabled(false); +<a class="jxr_linenumber" name="614" href="#614">614</a> setupTable(table); +<a class="jxr_linenumber" name="615" href="#615">615</a> assertEquals(ROWKEYS.length, countRows()); +<a class="jxr_linenumber" name="616" href="#616">616</a> +<a class="jxr_linenumber" name="617" href="#617">617</a> <strong class="jxr_keyword">try</strong>(RegionLocator rl = connection.getRegionLocator(tbl.getName())) { +<a class="jxr_linenumber" name="618" href="#618">618</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> +<a class="jxr_linenumber" name="619" href="#619">619</a> admin.flush(table); +<a class="jxr_linenumber" name="620" href="#620">620</a> HRegionInfo region1 = rl.getRegionLocation(Bytes.toBytes(<span class="jxr_string">"A"</span>)).getRegionInfo(); +<a class="jxr_linenumber" name="621" href="#621">621</a> HRegionInfo region2 = rl.getRegionLocation(Bytes.toBytes(<span class="jxr_string">"B"</span>)).getRegionInfo(); +<a class="jxr_linenumber" name="622" href="#622">622</a> +<a class="jxr_linenumber" name="623" href="#623">623</a> <strong class="jxr_keyword">int</strong> regionCountBeforeMerge = rl.getAllRegionLocations().size(); +<a class="jxr_linenumber" name="624" href="#624">624</a> +<a class="jxr_linenumber" name="625" href="#625">625</a> assertNotEquals(region1, region2); +<a class="jxr_linenumber" name="626" href="#626">626</a> +<a class="jxr_linenumber" name="627" href="#627">627</a> <em class="jxr_comment">// do a region merge</em> +<a class="jxr_linenumber" name="628" href="#628">628</a> admin.mergeRegions(region1.getEncodedNameAsBytes(), region2.getEncodedNameAsBytes(), false); +<a class="jxr_linenumber" name="629" href="#629">629</a> +<a class="jxr_linenumber" name="630" href="#630">630</a> <em class="jxr_comment">// wait until region merged</em> +<a class="jxr_linenumber" name="631" href="#631">631</a> <strong class="jxr_keyword">long</strong> timeout = System.currentTimeMillis() + 30 * 1000; +<a class="jxr_linenumber" name="632" href="#632">632</a> <strong class="jxr_keyword">while</strong> (<strong class="jxr_keyword">true</strong>) { +<a class="jxr_linenumber" name="633" href="#633">633</a> <strong class="jxr_keyword">if</strong> (rl.getAllRegionLocations().size() < regionCountBeforeMerge) { +<a class="jxr_linenumber" name="634" href="#634">634</a> <strong class="jxr_keyword">break</strong>; +<a class="jxr_linenumber" name="635" href="#635">635</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (System.currentTimeMillis() > timeout) { +<a class="jxr_linenumber" name="636" href="#636">636</a> fail(<span class="jxr_string">"Time out waiting on region "</span> + region1.getEncodedName() + <span class="jxr_string">" and "</span> + region2 +<a class="jxr_linenumber" name="637" href="#637">637</a> .getEncodedName() + <span class="jxr_string">" be merged"</span>); +<a class="jxr_linenumber" name="638" href="#638">638</a> } +<a class="jxr_linenumber" name="639" href="#639">639</a> Thread.sleep(10); +<a class="jxr_linenumber" name="640" href="#640">640</a> } +<a class="jxr_linenumber" name="641" href="#641">641</a> +<a class="jxr_linenumber" name="642" href="#642">642</a> assertEquals(ROWKEYS.length, countRows()); +<a class="jxr_linenumber" name="643" href="#643">643</a> +<a class="jxr_linenumber" name="644" href="#644">644</a> HBaseFsck hbck = doFsck(conf, false); +<a class="jxr_linenumber" name="645" href="#645">645</a> assertNoErrors(hbck); <em class="jxr_comment">// no errors</em> +<a class="jxr_linenumber" name="646" href="#646">646</a> } +<a class="jxr_linenumber" name="647" href="#647">647</a> +<a class="jxr_linenumber" name="648" href="#648">648</a> } <strong class="jxr_keyword">finally</strong> { +<a class="jxr_linenumber" name="649" href="#649">649</a> TEST_UTIL.getHBaseCluster().getMaster().setCatalogJanitorEnabled(<strong class="jxr_keyword">true</strong>); +<a class="jxr_linenumber" name="650" href="#650">650</a> cleanupTable(table); +<a class="jxr_linenumber" name="651" href="#651">651</a> IOUtils.closeQuietly(meta); +<a class="jxr_linenumber" name="652" href="#652">652</a> } +<a class="jxr_linenumber" name="653" href="#653">653</a> } +<a class="jxr_linenumber" name="654" href="#654">654</a> <em class="jxr_javadoccomment">/**</em> +<a class="jxr_linenumber" name="655" href="#655">655</a> <em class="jxr_javadoccomment"> * This creates entries in hbase:meta with no hdfs data. This should cleanly</em> +<a class="jxr_linenumber" name="656" href="#656">656</a> <em class="jxr_javadoccomment"> * remove the table.</em> +<a class="jxr_linenumber" name="657" href="#657">657</a> <em class="jxr_javadoccomment"> */</em> +<a class="jxr_linenumber" name="658" href="#658">658</a> @Test (timeout=180000) +<a class="jxr_linenumber" name="659" href="#659">659</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testNoHdfsTable() <strong class="jxr_keyword">throws</strong> Exception { +<a class="jxr_linenumber" name="660" href="#660">660</a> TableName table = TableName.valueOf(<span class="jxr_string">"NoHdfsTable"</span>); +<a class="jxr_linenumber" name="661" href="#661">661</a> setupTable(table); +<a class="jxr_linenumber" name="662" href="#662">662</a> assertEquals(ROWKEYS.length, countRows()); +<a class="jxr_linenumber" name="663" href="#663">663</a> +<a class="jxr_linenumber" name="664" href="#664">664</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> +<a class="jxr_linenumber" name="665" href="#665">665</a> admin.flush(table); +<a class="jxr_linenumber" name="666" href="#666">666</a> +<a class="jxr_linenumber" name="667" href="#667">667</a> <em class="jxr_comment">// Mess it up by deleting hdfs dirs</em> +<a class="jxr_linenumber" name="668" href="#668">668</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">""</span>), +<a class="jxr_linenumber" name="669" href="#669">669</a> Bytes.toBytes(<span class="jxr_string">"A"</span>), false, false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> +<a class="jxr_linenumber" name="670" href="#670">670</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"A"</span>), +<a class="jxr_linenumber" name="671" href="#671">671</a> Bytes.toBytes(<span class="jxr_string">"B"</span>), false, false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> +<a class="jxr_linenumber" name="672" href="#672">672</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"B"</span>), +<a class="jxr_linenumber" name="673" href="#673">673</a> Bytes.toBytes(<span class="jxr_string">"C"</span>), false, false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> +<a class="jxr_linenumber" name="674" href="#674">674</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"C"</span>), +<a class="jxr_linenumber" name="675" href="#675">675</a> Bytes.toBytes(<span class="jxr_string">""</span>), false, false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> +<a class="jxr_linenumber" name="676" href="#676">676</a> +<a class="jxr_linenumber" name="677" href="#677">677</a> <em class="jxr_comment">// also remove the table directory in hdfs</em> +<a class="jxr_linenumber" name="678" href="#678">678</a> deleteTableDir(table); +<a class="jxr_linenumber" name="679" href="#679">679</a> +<a class="jxr_linenumber" name="680" href="#680">680</a> HBaseFsck hbck = doFsck(conf, false); +<a class="jxr_linenumber" name="681" href="#681">681</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] {HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS, +<a class="jxr_linenumber" name="682" href="#682">682</a> HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS, HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS, +<a class="jxr_linenumber" name="683" href="#683">683</a> HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS, HBaseFsck.ErrorReporter.ERROR_CODE.ORPHAN_TABLE_STATE, }); +<a class="jxr_linenumber" name="684" href="#684">684</a> <em class="jxr_comment">// holes are separate from overlap groups</em> +<a class="jxr_linenumber" name="685" href="#685">685</a> assertEquals(0, hbck.getOverlapGroups(table).size()); +<a class="jxr_linenumber" name="686" href="#686">686</a> +<a class="jxr_linenumber" name="687" href="#687">687</a> <em class="jxr_comment">// fix hole</em> +<a class="jxr_linenumber" name="688" href="#688">688</a> doFsck(conf, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// detect dangling regions and remove those</em> +<a class="jxr_linenumber" name="689" href="#689">689</a> +<a class="jxr_linenumber" name="690" href="#690">690</a> <em class="jxr_comment">// check that hole fixed</em> +<a class="jxr_linenumber" name="691" href="#691">691</a> assertNoErrors(doFsck(conf,false)); +<a class="jxr_linenumber" name="692" href="#692">692</a> assertFalse(<span class="jxr_string">"Table "</span> + table + <span class="jxr_string">" should have been deleted"</span>, admin.tableExists(table)); +<a class="jxr_linenumber" name="693" href="#693">693</a> } +<a class="jxr_linenumber" name="694" href="#694">694</a> +<a class="jxr_linenumber" name="695" href="#695">695</a> <em class="jxr_javadoccomment">/**</em> +<a class="jxr_linenumber" name="696" href="#696">696</a> <em class="jxr_javadoccomment"> * when the hbase.version file missing, It is fix the fault.</em> +<a class="jxr_linenumber" name="697" href="#697">697</a> <em class="jxr_javadoccomment"> */</em> +<a class="jxr_linenumber" name="698" href="#698">698</a> @Test (timeout=180000) +<a class="jxr_linenumber" name="699" href="#699">699</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testNoVersionFile() <strong class="jxr_keyword">throws</strong> Exception { +<a class="jxr_linenumber" name="700" href="#700">700</a> <em class="jxr_comment">// delete the hbase.version file</em> +<a class="jxr_linenumber" name="701" href="#701">701</a> Path rootDir = FSUtils.getRootDir(conf); +<a class="jxr_linenumber" name="702" href="#702">702</a> FileSystem fs = rootDir.getFileSystem(conf); +<a class="jxr_linenumber" name="703" href="#703">703</a> Path versionFile = <strong class="jxr_keyword">new</strong> Path(rootDir, HConstants.VERSION_FILE_NAME); +<a class="jxr_linenumber" name="704" href="#704">704</a> fs.delete(versionFile, <strong class="jxr_keyword">true</strong>); +<a class="jxr_linenumber" name="705" href="#705">705</a> +<a class="jxr_linenumber" name="706" href="#706">706</a> <em class="jxr_comment">// test</em> +<a class="jxr_linenumber" name="707" href="#707">707</a> HBaseFsck hbck = doFsck(conf, false); +<a class="jxr_linenumber" name="708" href="#708">708</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.NO_VERSION_FILE }); +<a class="jxr_linenumber" name="709" href="#709">709</a> <em class="jxr_comment">// fix hbase.version missing</em> +<a class="jxr_linenumber" name="710" href="#710">710</a> doFsck(conf, <strong class="jxr_keyword">true</strong>); +<a class="jxr_linenumber" name="711" href="#711">711</a> +<a class="jxr_linenumber" name="712" href="#712">712</a> <em class="jxr_comment">// no version file fixed</em> +<a class="jxr_linenumber" name="713" href="#713">713</a> assertNoErrors(doFsck(conf, false)); +<a class="jxr_linenumber" name="714" href="#714">714</a> } +<a class="jxr_linenumber" name="715" href="#715">715</a> +<a class="jxr_linenumber" name="716" href="#716">716</a> @Test (timeout=180000) +<a class="jxr_linenumber" name="717" href="#717">717</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testNoTableState() <strong class="jxr_keyword">throws</strong> Exception { +<a class="jxr_linenumber" name="718" href="#718">718</a> <em class="jxr_comment">// delete the hbase.version file</em> +<a class="jxr_linenumber" name="719" href="#719">719</a> TableName table = +<a class="jxr_linenumber" name="720" href="#720">720</a> TableName.valueOf(<span class="jxr_string">"testNoTableState"</span>); +<a class="jxr_linenumber" name="721" href="#721">721</a> <strong class="jxr_keyword">try</strong> { +<a class="jxr_linenumber" name="722" href="#722">722</a> setupTable(table); +<a class="jxr_linenumber" name="723" href="#723">723</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> +<a class="jxr_linenumber" name="724" href="#724">724</a> admin.flush(table); +<a class="jxr_linenumber" name="725" href="#725">725</a> +<a class="jxr_linenumber" name="726" href="#726">726</a> MetaTableAccessor.deleteTableState(TEST_UTIL.getConnection(), table); +<a class="jxr_linenumber" name="727" href="#727">727</a> +<a class="jxr_linenumber" name="728" href="#728">728</a> <em class="jxr_comment">// test</em> +<a class="jxr_linenumber" name="729" href="#729">729</a> HBaseFsck hbck = doFsck(conf, false); +<a class="jxr_linenumber" name="730" href="#730">730</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.NO_TABLE_STATE }); +<a class="jxr_linenumber" name="731" href="#731">731</a> <em class="jxr_comment">// fix table state missing</em> +<a class="jxr_linenumber" name="732" href="#732">732</a> doFsck(conf, <strong class="jxr_keyword">true</strong>); <a class="jxr_linenumber" name="733" href="#733">733</a> -<a class="jxr_linenumber" name="734" href="#734">734</a> setupTable(table2); -<a class="jxr_linenumber" name="735" href="#735">735</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> -<a class="jxr_linenumber" name="736" href="#736">736</a> admin.flush(table2); -<a class="jxr_linenumber" name="737" href="#737">737</a> <em class="jxr_comment">// Mess them up by leaving a hole in the hdfs data</em> -<a class="jxr_linenumber" name="738" href="#738">738</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"B"</span>), Bytes.toBytes(<span class="jxr_string">"C"</span>), false, -<a class="jxr_linenumber" name="739" href="#739">739</a> false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> +<a class="jxr_linenumber" name="734" href="#734">734</a> assertNoErrors(doFsck(conf, false)); +<a class="jxr_linenumber" name="735" href="#735">735</a> assertTrue(TEST_UTIL.getHBaseAdmin().isTableEnabled(table)); +<a class="jxr_linenumber" name="736" href="#736">736</a> } <strong class="jxr_keyword">finally</strong> { +<a class="jxr_linenumber" name="737" href="#737">737</a> cleanupTable(table); +<a class="jxr_linenumber" name="738" href="#738">738</a> } +<a class="jxr_linenumber" name="739" href="#739">739</a> } <a class="jxr_linenumber" name="740" href="#740">740</a> -<a class="jxr_linenumber" name="741" href="#741">741</a> HBaseFsck hbck = doFsck(conf, false); -<a class="jxr_linenumber" name="742" href="#742">742</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS, HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS }); -<a class="jxr_linenumber" name="743" href="#743">743</a> -<a class="jxr_linenumber" name="744" href="#744">744</a> <em class="jxr_comment">// fix hole in table 1</em> -<a class="jxr_linenumber" name="745" href="#745">745</a> doFsck(conf, <strong class="jxr_keyword">true</strong>, table1); -<a class="jxr_linenumber" name="746" href="#746">746</a> <em class="jxr_comment">// check that hole in table 1 fixed</em> -<a class="jxr_linenumber" name="747" href="#747">747</a> assertNoErrors(doFsck(conf, false, table1)); -<a class="jxr_linenumber" name="748" href="#748">748</a> <em class="jxr_comment">// check that hole in table 2 still there</em> -<a class="jxr_linenumber" name="749" href="#749">749</a> assertErrors(doFsck(conf, false, table2), <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS }); -<a class="jxr_linenumber" name="750" href="#750">750</a> -<a class="jxr_linenumber" name="751" href="#751">751</a> <em class="jxr_comment">// fix hole in table 2</em> -<a class="jxr_linenumber" name="752" href="#752">752</a> doFsck(conf, <strong class="jxr_keyword">true</strong>, table2); -<a class="jxr_linenumber" name="753" href="#753">753</a> <em class="jxr_comment">// check that hole in both tables fixed</em> -<a class="jxr_linenumber" name="754" href="#754">754</a> assertNoErrors(doFsck(conf, false)); -<a class="jxr_linenumber" name="755" href="#755">755</a> assertEquals(ROWKEYS.length - 2, countRows()); -<a class="jxr_linenumber" name="756" href="#756">756</a> } <strong class="jxr_keyword">finally</strong> { -<a class="jxr_linenumber" name="757" href="#757">757</a> cleanupTable(table1); -<a class="jxr_linenumber" name="758" href="#758">758</a> cleanupTable(table2); -<a class="jxr_linenumber" name="759" href="#759">759</a> } -<a class="jxr_linenumber" name="760" href="#760">760</a> } -<a class="jxr_linenumber" name="761" href="#761">761</a> <em class="jxr_javadoccomment">/**</em> -<a class="jxr_linenumber" name="762" href="#762">762</a> <em class="jxr_javadoccomment"> * A split parent in meta, in hdfs, and not deployed</em> -<a class="jxr_linenumber" name="763" href="#763">763</a> <em class="jxr_javadoccomment"> */</em> -<a class="jxr_linenumber" name="764" href="#764">764</a> @Test (timeout=180000) -<a class="jxr_linenumber" name="765" href="#765">765</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testLingeringSplitParent() <strong class="jxr_keyword">throws</strong> Exception { -<a class="jxr_linenumber" name="766" href="#766">766</a> TableName table = -<a class="jxr_linenumber" name="767" href="#767">767</a> TableName.valueOf(<span class="jxr_string">"testLingeringSplitParent"</span>); -<a class="jxr_linenumber" name="768" href="#768">768</a> Table meta = <strong class="jxr_keyword">null</strong>; -<a class="jxr_linenumber" name="769" href="#769">769</a> <strong class="jxr_keyword">try</strong> { -<a class="jxr_linenumber" name="770" href="#770">770</a> setupTable(table); -<a class="jxr_linenumber" name="771" href="#771">771</a> assertEquals(ROWKEYS.length, countRows()); -<a class="jxr_linenumber" name="772" href="#772">772</a> -<a class="jxr_linenumber" name="773" href="#773">773</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> -<a class="jxr_linenumber" name="774" href="#774">774</a> admin.flush(table); -<a class="jxr_linenumber" name="775" href="#775">775</a> -<a class="jxr_linenumber" name="776" href="#776">776</a> HRegionLocation location; -<a class="jxr_linenumber" name="777" href="#777">777</a> <strong class="jxr_keyword">try</strong>(RegionLocator rl = connection.getRegionLocator(tbl.getName())) { -<a class="jxr_linenumber" name="778" href="#778">778</a> location = rl.getRegionLocation(Bytes.toBytes(<span class="jxr_string">"B"</span>)); -<a class="jxr_linenumber" name="779" href="#779">779</a> } -<a class="jxr_linenumber" name="780" href="#780">780</a> -<a class="jxr_linenumber" name="781" href="#781">781</a> <em class="jxr_comment">// Delete one region from meta, but not hdfs, unassign it.</em> -<a class="jxr_linenumber" name="782" href="#782">782</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"B"</span>), -<a class="jxr_linenumber" name="783" href="#783">783</a> Bytes.toBytes(<span class="jxr_string">"C"</span>), <strong class="jxr_keyword">true</strong>, <strong class="jxr_keyword">true</strong>, false); -<a class="jxr_linenumber" name="784" href="#784">784</a> -<a class="jxr_linenumber" name="785" href="#785">785</a> <em class="jxr_comment">// Create a new meta entry to fake it as a split parent.</em> -<a class="jxr_linenumber" name="786" href="#786">786</a> meta = connection.getTable(TableName.META_TABLE_NAME, tableExecutorService); -<a class="jxr_linenumber" name="787" href="#787">787</a> HRegionInfo hri = location.getRegionInfo(); -<a class="jxr_linenumber" name="788" href="#788">788</a> -<a class="jxr_linenumber" name="789" href="#789">789</a> HRegionInfo a = <strong class="jxr_keyword">new</strong> HRegionInfo(tbl.getName(), -<a class="jxr_linenumber" name="790" href="#790">790</a> Bytes.toBytes(<span class="jxr_string">"B"</span>), Bytes.toBytes(<span class="jxr_string">"BM"</span>)); -<a class="jxr_linenumber" name="791" href="#791">791</a> HRegionInfo b = <strong class="jxr_keyword">new</strong> HRegionInfo(tbl.getName(), -<a class="jxr_linenumber" name="792" href="#792">792</a> Bytes.toBytes(<span class="jxr_string">"BM"</span>), Bytes.toBytes(<span class="jxr_string">"C"</span>)); -<a class="jxr_linenumber" name="793" href="#793">793</a> -<a class="jxr_linenumber" name="794" href="#794">794</a> hri.setOffline(<strong class="jxr_keyword">true</strong>); -<a class="jxr_linenumber" name="795" href="#795">795</a> hri.setSplit(<strong class="jxr_keyword">true</strong>); +<a class="jxr_linenumber" name="741" href="#741">741</a> <em class="jxr_javadoccomment">/**</em> +<a class="jxr_linenumber" name="742" href="#742">742</a> <em class="jxr_javadoccomment"> * This creates two tables and mess both of them and fix them one by one</em> +<a class="jxr_linenumber" name="743" href="#743">743</a> <em class="jxr_javadoccomment"> */</em> +<a class="jxr_linenumber" name="744" href="#744">744</a> @Test (timeout=180000) +<a class="jxr_linenumber" name="745" href="#745">745</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testFixByTable() <strong class="jxr_keyword">throws</strong> Exception { +<a class="jxr_linenumber" name="746" href="#746">746</a> TableName table1 = +<a class="jxr_linenumber" name="747" href="#747">747</a> TableName.valueOf(<span class="jxr_string">"testFixByTable1"</span>); +<a class="jxr_linenumber" name="748" href="#748">748</a> TableName table2 = +<a class="jxr_linenumber" name="749" href="#749">749</a> TableName.valueOf(<span class="jxr_string">"testFixByTable2"</span>); +<a class="jxr_linenumber" name="750" href="#750">750</a> <strong class="jxr_keyword">try</strong> { +<a class="jxr_linenumber" name="751" href="#751">751</a> setupTable(table1); +<a class="jxr_linenumber" name="752" href="#752">752</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> +<a class="jxr_linenumber" name="753" href="#753">753</a> admin.flush(table1); +<a class="jxr_linenumber" name="754" href="#754">754</a> <em class="jxr_comment">// Mess them up by leaving a hole in the hdfs data</em> +<a class="jxr_linenumber" name="755" href="#755">755</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"B"</span>), +<a class="jxr_linenumber" name="756" href="#756">756</a> Bytes.toBytes(<span class="jxr_string">"C"</span>), false, false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> +<a class="jxr_linenumber" name="757" href="#757">757</a> +<a class="jxr_linenumber" name="758" href="#758">758</a> setupTable(table2); +<a class="jxr_linenumber" name="759" href="#759">759</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> +<a class="jxr_linenumber" name="760" href="#760">760</a> admin.flush(table2); +<a class="jxr_linenumber" name="761" href="#761">761</a> <em class="jxr_comment">// Mess them up by leaving a hole in the hdfs data</em> +<a class="jxr_linenumber" name="762" href="#762">762</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"B"</span>), Bytes.toBytes(<span class="jxr_string">"C"</span>), false, +<a class="jxr_linenumber" name="763" href="#763">763</a> false, <strong class="jxr_keyword">true</strong>); <em class="jxr_comment">// don't rm meta</em> +<a class="jxr_linenumber" name="764" href="#764">764</a> +<a class="jxr_linenumber" name="765" href="#765">765</a> HBaseFsck hbck = doFsck(conf, false); +<a class="jxr_linenumber" name="766" href="#766">766</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS, HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS }); +<a class="jxr_linenumber" name="767" href="#767">767</a> +<a class="jxr_linenumber" name="768" href="#768">768</a> <em class="jxr_comment">// fix hole in table 1</em> +<a class="jxr_linenumber" name="769" href="#769">769</a> doFsck(conf, <strong class="jxr_keyword">true</strong>, table1); +<a class="jxr_linenumber" name="770" href="#770">770</a> <em class="jxr_comment">// check that hole in table 1 fixed</em> +<a class="jxr_linenumber" name="771" href="#771">771</a> assertNoErrors(doFsck(conf, false, table1)); +<a class="jxr_linenumber" name="772" href="#772">772</a> <em class="jxr_comment">// check that hole in table 2 still there</em> +<a class="jxr_linenumber" name="773" href="#773">773</a> assertErrors(doFsck(conf, false, table2), <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_HDFS }); +<a class="jxr_linenumber" name="774" href="#774">774</a> +<a class="jxr_linenumber" name="775" href="#775">775</a> <em class="jxr_comment">// fix hole in table 2</em> +<a class="jxr_linenumber" name="776" href="#776">776</a> doFsck(conf, <strong class="jxr_keyword">true</strong>, table2); +<a class="jxr_linenumber" name="777" href="#777">777</a> <em class="jxr_comment">// check that hole in both tables fixed</em> +<a class="jxr_linenumber" name="778" href="#778">778</a> assertNoErrors(doFsck(conf, false)); +<a class="jxr_linenumber" name="779" href="#779">779</a> assertEquals(ROWKEYS.length - 2, countRows()); +<a class="jxr_linenumber" name="780" href="#780">780</a> } <strong class="jxr_keyword">finally</strong> { +<a class="jxr_linenumber" name="781" href="#781">781</a> cleanupTable(table1); +<a class="jxr_linenumber" name="782" href="#782">782</a> cleanupTable(table2); +<a class="jxr_linenumber" name="783" href="#783">783</a> } +<a class="jxr_linenumber" name="784" href="#784">784</a> } +<a class="jxr_linenumber" name="785" href="#785">785</a> <em class="jxr_javadoccomment">/**</em> +<a class="jxr_linenumber" name="786" href="#786">786</a> <em class="jxr_javadoccomment"> * A split parent in meta, in hdfs, and not deployed</em> +<a class="jxr_linenumber" name="787" href="#787">787</a> <em class="jxr_javadoccomment"> */</em> +<a class="jxr_linenumber" name="788" href="#788">788</a> @Test (timeout=180000) +<a class="jxr_linenumber" name="789" href="#789">789</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testLingeringSplitParent() <strong class="jxr_keyword">throws</strong> Exception { +<a class="jxr_linenumber" name="790" href="#790">790</a> TableName table = +<a class="jxr_linenumber" name="791" href="#791">791</a> TableName.valueOf(<span class="jxr_string">"testLingeringSplitParent"</span>); +<a class="jxr_linenumber" name="792" href="#792">792</a> Table meta = <strong class="jxr_keyword">null</strong>; +<a class="jxr_linenumber" name="793" href="#793">793</a> <strong class="jxr_keyword">try</strong> { +<a class="jxr_linenumber" name="794" href="#794">794</a> setupTable(table); +<a class="jxr_linenumber" name="795" href="#795">795</a> assertEquals(ROWKEYS.length, countRows()); <a class="jxr_linenumber" name="796" href="#796">796</a> -<a class="jxr_linenumber" name="797" href="#797">797</a> MetaTableAccessor.addRegionToMeta(meta, hri, a, b); -<a class="jxr_linenumber" name="798" href="#798">798</a> meta.close(); -<a class="jxr_linenumber" name="799" href="#799">799</a> admin.flush(TableName.META_TABLE_NAME); -<a class="jxr_linenumber" name="800" href="#800">800</a> -<a class="jxr_linenumber" name="801" href="#801">801</a> HBaseFsck hbck = doFsck(conf, false); -<a class="jxr_linenumber" name="802" href="#802">802</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { -<a class="jxr_linenumber" name="803" href="#803">803</a> HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_SPLIT_PARENT, HBaseFsck.ErrorReporter.ERROR_CODE.HOLE_IN_REGION_CHAIN}); +<a class="jxr_linenumber" name="797" href="#797">797</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> +<a class="jxr_linenumber" name="798" href="#798">798</a> admin.flush(table); +<a class="jxr_linenumber" name="799" href="#799">799</a> +<a class="jxr_linenumber" name="800" href="#800">800</a> HRegionLocation location; +<a class="jxr_linenumber" name="801" href="#801">801</a> <strong class="jxr_keyword">try</strong>(RegionLocator rl = connection.getRegionLocator(tbl.getName())) { +<a class="jxr_linenumber" name="802" href="#802">802</a> location = rl.getRegionLocation(Bytes.toBytes(<span class="jxr_string">"B"</span>)); +<a class="jxr_linenumber" name="803" href="#803">803</a> } <a class="jxr_linenumber" name="804" href="#804">804</a> -<a class="jxr_linenumber" name="805" href="#805">805</a> <em class="jxr_comment">// regular repair cannot fix lingering split parent</em> -<a class="jxr_linenumber" name="806" href="#806">806</a> hbck = doFsck(conf, <strong class="jxr_keyword">true</strong>); -<a class="jxr_linenumber" name="807" href="#807">807</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { -<a class="jxr_linenumber" name="808" href="#808">808</a> HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_SPLIT_PARENT, HBaseFsck.ErrorReporter.ERROR_CODE.HOLE_IN_REGION_CHAIN }); -<a class="jxr_linenumber" name="809" href="#809">809</a> assertFalse(hbck.shouldRerun()); -<a class="jxr_linenumber" name="810" href="#810">810</a> hbck = doFsck(conf, false); -<a class="jxr_linenumber" name="811" href="#811">811</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { -<a class="jxr_linenumber" name="812" href="#812">812</a> HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_SPLIT_PARENT, HBaseFsck.ErrorReporter.ERROR_CODE.HOLE_IN_REGION_CHAIN}); -<a class="jxr_linenumber" name="813" href="#813">813</a> -<a class="jxr_linenumber" name="814" href="#814">814</a> <em class="jxr_comment">// fix lingering split parent</em> -<a class="jxr_linenumber" name="815" href="#815">815</a> hbck = <strong class="jxr_keyword">new</strong> HBaseFsck(conf, hbfsckExecutorService); -<a class="jxr_linenumber" name="816" href="#816">816</a> hbck.connect(); -<a class="jxr_linenumber" name="817" href="#817">817</a> HBaseFsck.setDisplayFullReport(); <em class="jxr_comment">// i.e. -details</em> -<a class="jxr_linenumber" name="818" href="#818">818</a> hbck.setTimeLag(0); -<a class="jxr_linenumber" name="819" href="#819">819</a> hbck.setFixSplitParents(<strong class="jxr_keyword">true</strong>); -<a class="jxr_linenumber" name="820" href="#820">820</a> hbck.onlineHbck(); -<a class="jxr_linenumber" name="821" href="#821">821</a> assertTrue(hbck.shouldRerun()); -<a class="jxr_linenumber" name="822" href="#822">822</a> hbck.close(); -<a class="jxr_linenumber" name="823" href="#823">823</a> -<a class="jxr_linenumber" name="824" href="#824">824</a> Get get = <strong class="jxr_keyword">new</strong> Get(hri.getRegionName()); -<a class="jxr_linenumber" name="825" href="#825">825</a> Result result = meta.get(get); -<a class="jxr_linenumber" name="826" href="#826">826</a> assertTrue(result.getColumnCells(HConstants.CATALOG_FAMILY, -<a class="jxr_linenumber" name="827" href="#827">827</a> HConstants.SPLITA_QUALIFIER).isEmpty()); -<a class="jxr_linenumber" name="828" href="#828">828</a> assertTrue(result.getColumnCells(HConstants.CATALOG_FAMILY, -<a class="jxr_linenumber" name="829" href="#829">829</a> HConstants.SPLITB_QUALIFIER).isEmpty()); -<a class="jxr_linenumber" name="830" href="#830">830</a> admin.flush(TableName.META_TABLE_NAME); -<a class="jxr_linenumber" name="831" href="#831">831</a> -<a class="jxr_linenumber" name="832" href="#832">832</a> <em class="jxr_comment">// fix other issues</em> -<a class="jxr_linenumber" name="833" href="#833">833</a> doFsck(conf, <strong class="jxr_keyword">true</strong>); -<a class="jxr_linenumber" name="834" href="#834">834</a> -<a class="jxr_linenumber" name="835" href="#835">835</a> <em class="jxr_comment">// check that all are fixed</em> -<a class="jxr_linenumber" name="836" href="#836">836</a> assertNoErrors(doFsck(conf, false)); -<a class="jxr_linenumber" name="837" href="#837">837</a> assertEquals(ROWKEYS.length, countRows()); -<a class="jxr_linenumber" name="838" href="#838">838</a> } <strong class="jxr_keyword">finally</strong> { -<a class="jxr_linenumber" name="839" href="#839">839</a> cleanupTable(table); -<a class="jxr_linenumber" name="840" href="#840">840</a> IOUtils.closeQuietly(meta); -<a class="jxr_linenumber" name="841" href="#841">841</a> } -<a class="jxr_linenumber" name="842" href="#842">842</a> } -<a class="jxr_linenumber" name="843" href="#843">843</a> -<a class="jxr_linenumber" name="844" href="#844">844</a> <em class="jxr_javadoccomment">/**</em> -<a class="jxr_linenumber" name="845" href="#845">845</a> <em class="jxr_javadoccomment"> * Tests that LINGERING_SPLIT_PARENT is not erroneously reported for</em> -<a class="jxr_linenumber" name="846" href="#846">846</a> <em class="jxr_javadoccomment"> * valid cases where the daughters are there.</em> -<a class="jxr_linenumber" name="847" href="#847">847</a> <em class="jxr_javadoccomment"> */</em> -<a class="jxr_linenumber" name="848" href="#848">848</a> @Test (timeout=180000) -<a class="jxr_linenumber" name="849" href="#849">849</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testValidLingeringSplitParent() <strong class="jxr_keyword">throws</strong> Exception { -<a class="jxr_linenumber" name="850" href="#850">850</a> TableName table = -<a class="jxr_linenumber" name="851" href="#851">851</a> TableName.valueOf(<span class="jxr_string">"testLingeringSplitParent"</span>); -<a class="jxr_linenumber" name="852" href="#852">852</a> Table meta = <strong class="jxr_keyword">null</strong>; -<a class="jxr_linenumber" name="853" href="#853">853</a> <strong class="jxr_keyword">try</strong> { -<a class="jxr_linenumber" name="854" href="#854">854</a> setupTable(table); -<a class="jxr_linenumber" name="855" href="#855">855</a> assertEquals(ROWKEYS.length, countRows()); -<a class="jxr_linenumber" name="856" href="#856">856</a> -<a class="jxr_linenumber" name="857" href="#857">857</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> -<a class="jxr_linenumber" name="858" href="#858">858</a> admin.flush(table); -<a class="jxr_linenumber" name="859" href="#859">859</a> -<a class="jxr_linenumber" name="860" href="#860">860</a> <strong class="jxr_keyword">try</strong>(RegionLocator rl = connection.getRegionLocator(tbl.getName())) { -<a class="jxr_linenumber" name="861" href="#861">861</a> HRegionLocation location = rl.getRegionLocation(Bytes.toBytes(<span class="jxr_string">"B"</span>)); -<a class="jxr_linenumber" name="862" href="#862">862</a> -<a class="jxr_linenumber" name="863" href="#863">863</a> meta = connection.getTable(TableName.META_TABLE_NAME, tableExecutorService); -<a class="jxr_linenumber" name="864" href="#864">864</a> HRegionInfo hri = location.getRegionInfo(); -<a class="jxr_linenumber" name="865" href="#865">865</a> -<a class="jxr_linenumber" name="866" href="#866">866</a> <em class="jxr_comment">// do a regular split</em> -<a class="jxr_linenumber" name="867" href="#867">867</a> byte[] regionName = location.getRegionInfo().getRegionName(); -<a class="jxr_linenumber" name="868" href="#868">868</a> admin.splitRegion(location.getRegionInfo().getRegionName(), Bytes.toBytes(<span class="jxr_string">"BM"</span>)); -<a class="jxr_linenumber" name="869" href="#869">869</a> TestEndToEndSplitTransaction.blockUntilRegionSplit(conf, 60000, regionName, <strong class="jxr_keyword">true</strong>); -<a class="jxr_linenumber" name="870" href="#870">870</a> -<a class="jxr_linenumber" name="871" href="#871">871</a> <em class="jxr_comment">// TODO: fixHdfsHoles does not work against splits, since the parent dir lingers on</em> -<a class="jxr_linenumber" name="872" href="#872">872</a> <em class="jxr_comment">// for some time until children references are deleted. HBCK erroneously sees this as</em> -<a class="jxr_linenumber" name="873" href="#873">873</a> <em class="jxr_comment">// overlapping regions</em> -<a class="jxr_linenumber" name="874" href="#874">874</a> HBaseFsck hbck = doFsck(conf, <strong class="jxr_keyword">true</strong>, <strong class="jxr_keyword">true</strong>, false, false, false, <strong class="jxr_keyword">true</strong>, <strong class="jxr_keyword">true</strong>, <strong class="jxr_keyword">true</strong>, false, -<a class="jxr_linenumber" name="875" href="#875">875</a> false, false, <strong class="jxr_keyword">null</strong>); -<a class="jxr_linenumber" name="876" href="#876">876</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] {}); <em class="jxr_comment">//no LINGERING_SPLIT_PARENT reported</em> -<a class="jxr_linenumber" name="877" href="#877">877</a> -<a class="jxr_linenumber" name="878" href="#878">878</a> <em class="jxr_comment">// assert that the split hbase:meta entry is still there.</em> -<a class="jxr_linenumber" name="879" href="#879">879</a> Get get = <strong class="jxr_keyword">new</strong> Get(hri.getRegionName()); -<a class="jxr_linenumber" name="880" href="#880">880</a> Result result = meta.get(get); -<a class="jxr_linenumber" name="881" href="#881">881</a> assertNotNull(result); -<a class="jxr_linenumber" name="882" href="#882">882</a> assertNotNull(MetaTableAccessor.getHRegionInfo(result)); +<a class="jxr_linenumber" name="805" href="#805">805</a> <em class="jxr_comment">// Delete one region from meta, but not hdfs, unassign it.</em> +<a class="jxr_linenumber" name="806" href="#806">806</a> deleteRegion(conf, tbl.getTableDescriptor(), Bytes.toBytes(<span class="jxr_string">"B"</span>), +<a class="jxr_linenumber" name="807" href="#807">807</a> Bytes.toBytes(<span class="jxr_string">"C"</span>), <strong class="jxr_keyword">true</strong>, <strong class="jxr_keyword">true</strong>, false); +<a class="jxr_linenumber" name="808" href="#808">808</a> +<a class="jxr_linenumber" name="809" href="#809">809</a> <em class="jxr_comment">// Create a new meta entry to fake it as a split parent.</em> +<a class="jxr_linenumber" name="810" href="#810">810</a> meta = connection.getTable(TableName.META_TABLE_NAME, tableExecutorService); +<a class="jxr_linenumber" name="811" href="#811">811</a> HRegionInfo hri = location.getRegionInfo(); +<a class="jxr_linenumber" name="812" href="#812">812</a> +<a class="jxr_linenumber" name="813" href="#813">813</a> HRegionInfo a = <strong class="jxr_keyword">new</strong> HRegionInfo(tbl.getName(), +<a class="jxr_linenumber" name="814" href="#814">814</a> Bytes.toBytes(<span class="jxr_string">"B"</span>), Bytes.toBytes(<span class="jxr_string">"BM"</span>)); +<a class="jxr_linenumber" name="815" href="#815">815</a> HRegionInfo b = <strong class="jxr_keyword">new</strong> HRegionInfo(tbl.getName(), +<a class="jxr_linenumber" name="816" href="#816">816</a> Bytes.toBytes(<span class="jxr_string">"BM"</span>), Bytes.toBytes(<span class="jxr_string">"C"</span>)); +<a class="jxr_linenumber" name="817" href="#817">817</a> +<a class="jxr_linenumber" name="818" href="#818">818</a> hri.setOffline(<strong class="jxr_keyword">true</strong>); +<a class="jxr_linenumber" name="819" href="#819">819</a> hri.setSplit(<strong class="jxr_keyword">true</strong>); +<a class="jxr_linenumber" name="820" href="#820">820</a> +<a class="jxr_linenumber" name="821" href="#821">821</a> MetaTableAccessor.addRegionToMeta(meta, hri, a, b); +<a class="jxr_linenumber" name="822" href="#822">822</a> meta.close(); +<a class="jxr_linenumber" name="823" href="#823">823</a> admin.flush(TableName.META_TABLE_NAME); +<a class="jxr_linenumber" name="824" href="#824">824</a> +<a class="jxr_linenumber" name="825" href="#825">825</a> HBaseFsck hbck = doFsck(conf, false); +<a class="jxr_linenumber" name="826" href="#826">826</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { +<a class="jxr_linenumber" name="827" href="#827">827</a> HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_SPLIT_PARENT, HBaseFsck.ErrorReporter.ERROR_CODE.HOLE_IN_REGION_CHAIN}); +<a class="jxr_linenumber" name="828" href="#828">828</a> +<a class="jxr_linenumber" name="829" href="#829">829</a> <em class="jxr_comment">// regular repair cannot fix lingering split parent</em> +<a class="jxr_linenumber" name="830" href="#830">830</a> hbck = doFsck(conf, <strong class="jxr_keyword">true</strong>); +<a class="jxr_linenumber" name="831" href="#831">831</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { +<a class="jxr_linenumber" name="832" href="#832">832</a> HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_SPLIT_PARENT, HBaseFsck.ErrorReporter.ERROR_CODE.HOLE_IN_REGION_CHAIN }); +<a class="jxr_linenumber" name="833" href="#833">833</a> assertFalse(hbck.shouldRerun()); +<a class="jxr_linenumber" name="834" href="#834">834</a> hbck = doFsck(conf, false); +<a class="jxr_linenumber" name="835" href="#835">835</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { +<a class="jxr_linenumber" name="836" href="#836">836</a> HBaseFsck.ErrorReporter.ERROR_CODE.LINGERING_SPLIT_PARENT, HBaseFsck.ErrorReporter.ERROR_CODE.HOLE_IN_REGION_CHAIN}); +<a class="jxr_linenumber" name="837" href="#837">837</a> +<a class="jxr_linenumber" name="838" href="#838">838</a> <em class="jxr_comment">// fix lingering split parent</em> +<a class="jxr_linenumber" name="839" href="#839">839</a> hbck = <strong class="jxr_keyword">new</strong> HBaseFsck(conf, hbfsckExecutorService); +<a class="jxr_linenumber" name="840" href="#840">840</a> hbck.connect(); +<a class="jxr_linenumber" name="841" href="#841">841</a> HBaseFsck.setDisplayFullReport(); <em class="jxr_comment">// i.e. -details</em> +<a class="jxr_linenumber" name="842" href="#842">842</a> hbck.setTimeLag(0); +<a class="jxr_linenumber" name="843" href="#843">843</a> hbck.setFixSplitParents(<strong class="jxr_keyword">true</strong>); +<a class="jxr_linenumber" name="844" href="#844">844</a> hbck.onlineHbck(); +<a class="jxr_linenumber" name="845" href="#845">845</a> assertTrue(hbck.shouldRerun()); +<a class="jxr_linenumber" name="846" href="#846">846</a> hbck.close(); +<a class="jxr_linenumber" name="847" href="#847">847</a> +<a class="jxr_linenumber" name="848" href="#848">848</a> Get get = <strong class="jxr_keyword">new</strong> Get(hri.getRegionName()); +<a class="jxr_linenumber" name="849" href="#849">849</a> Result result = meta.get(get); +<a class="jxr_linenumber" name="850" href="#850">850</a> assertTrue(result.getColumnCells(HConstants.CATALOG_FAMILY, +<a class="jxr_linenumber" name="851" href="#851">851</a> HConstants.SPLITA_QUALIFIER).isEmpty()); +<a class="jxr_linenumber" name="852" href="#852">852</a> assertTrue(result.getColumnCells(HConstants.CATALOG_FAMILY, +<a class="jxr_linenumber" name="853" href="#853">853</a> HConstants.SPLITB_QUALIFIER).isEmpty()); +<a class="jxr_linenumber" name="854" href="#854">854</a> admin.flush(TableName.META_TABLE_NAME); +<a class="jxr_linenumber" name="855" href="#855">855</a> +<a class="jxr_linenumber" name="856" href="#856">856</a> <em class="jxr_comment">// fix other issues</em> +<a class="jxr_linenumber" name="857" href="#857">857</a> doFsck(conf, <strong class="jxr_keyword">true</strong>); +<a class="jxr_linenumber" name="858" href="#858">858</a> +<a class="jxr_linenumber" name="859" href="#859">859</a> <em class="jxr_comment">// check that all are fixed</em> +<a class="jxr_linenumber" name="860" href="#860">860</a> assertNoErrors(doFsck(conf, false)); +<a class="jxr_linenumber" name="861" href="#861">861</a> assertEquals(ROWKEYS.length, countRows()); +<a class="jxr_linenumber" name="862" href="#862">862</a> } <strong class="jxr_keyword">finally</strong> { +<a class="jxr_linenumber" name="863" href="#863">863</a> cleanupTable(table); +<a class="jxr_linenumber" name="864" href="#864">864</a> IOUtils.closeQuietly(meta); +<a class="jxr_linenumber" name="865" href="#865">865</a> } +<a class="jxr_linenumber" name="866" href="#866">866</a> } +<a class="jxr_linenumber" name="867" href="#867">867</a> +<a class="jxr_linenumber" name="868" href="#868">868</a> <em class="jxr_javadoccomment">/**</em> +<a class="jxr_linenumber" name="869" href="#869">869</a> <em class="jxr_javadoccomment"> * Tests that LINGERING_SPLIT_PARENT is not erroneously reported for</em> +<a class="jxr_linenumber" name="870" href="#870">870</a> <em class="jxr_javadoccomment"> * valid cases where the daughters are there.</em> +<a class="jxr_linenumber" name="871" href="#871">871</a> <em class="jxr_javadoccomment"> */</em> +<a class="jxr_linenumber" name="872" href="#872">872</a> @Test (timeout=180000) +<a class="jxr_linenumber" name="873" href="#873">873</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testValidLingeringSplitParent() <strong class="jxr_keyword">throws</strong> Exception { +<a class="jxr_linenumber" name="874" href="#874">874</a> TableName table = +<a class="jxr_linenumber" name="875" href="#875">875</a> TableName.valueOf(<span class="jxr_string">"testLingeringSplitParent"</span>); +<a class="jxr_linenumber" name="876" href="#876">876</a> Table meta = <strong class="jxr_keyword">null</strong>; +<a class="jxr_linenumber" name="877" href="#877">877</a> <strong class="jxr_keyword">try</strong> { +<a class="jxr_linenumber" name="878" href="#878">878</a> setupTable(table); +<a class="jxr_linenumber" name="879" href="#879">879</a> assertEquals(ROWKEYS.length, countRows()); +<a class="jxr_linenumber" name="880" href="#880">880</a> +<a class="jxr_linenumber" name="881" href="#881">881</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> +<a class="jxr_linenumber" name="882" href="#882">882</a> admin.flush(table); <a class="jxr_linenumber" name="883" href="#883">883</a> -<a class="jxr_linenumber" name="884" href="#884">884</a> assertEquals(ROWKEYS.length, countRows()); -<a class="jxr_linenumber" name="885" href="#885">885</a> -<a class="jxr_linenumber" name="886" href="#886">886</a> <em class="jxr_comment">// assert that we still have the split regions</em> -<a class="jxr_linenumber" name="887" href="#887">887</a> assertEquals(rl.getStartKeys().length, SPLITS.length + 1 + 1); <em class="jxr_comment">//SPLITS + 1 is # regions</em> -<a class="jxr_linenumber" name="888" href="#888">888</a> <em class="jxr_comment">// pre-split.</em> -<a class="jxr_linenumber" name="889" href="#889">889</a> assertNoErrors(doFsck(conf, false)); -<a class="jxr_linenumber" name="890" href="#890">890</a> } -<a class="jxr_linenumber" name="891" href="#891">891</a> } <strong class="jxr_keyword">finally</strong> { -<a class="jxr_linenumber" name="892" href="#892">892</a> cleanupTable(table); -<a class="jxr_linenumber" name="893" href="#893">893</a> IOUtils.closeQuietly(meta); -<a class="jxr_linenumber" name="894" href="#894">894</a> } -<a class="jxr_linenumber" name="895" href="#895">895</a> } -<a class="jxr_linenumber" name="896" href="#896">896</a> -<a class="jxr_linenumber" name="897" href="#897">897</a> <em class="jxr_javadoccomment">/**</em> -<a class="jxr_linenumber" name="898" href="#898">898</a> <em class="jxr_javadoccomment"> * Split crashed after write to hbase:meta finished for the parent region, but</em> -<a class="jxr_linenumber" name="899" href="#899">899</a> <em class="jxr_javadoccomment"> * failed to write daughters (pre HBASE-7721 codebase)</em> -<a class="jxr_linenumber" name="900" href="#900">900</a> <em class="jxr_javadoccomment"> */</em> -<a class="jxr_linenumber" name="901" href="#901">901</a> @Test(timeout=75000) -<a class="jxr_linenumber" name="902" href="#902">902</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testSplitDaughtersNotInMeta() <strong class="jxr_keyword">throws</strong> Exception { -<a class="jxr_linenumber" name="903" href="#903">903</a> TableName table = TableName.valueOf(<span class="jxr_string">"testSplitdaughtersNotInMeta"</span>); -<a class="jxr_linenumber" name="904" href="#904">904</a> Table meta = connection.getTable(TableName.META_TABLE_NAME, tableExecutorService); -<a class="jxr_linenumber" name="905" href="#905">905</a> <strong class="jxr_keyword">try</strong> { -<a class="jxr_linenumber" name="906" href="#906">906</a> setupTable(table); -<a class="jxr_linenumber" name="907" href="#907">907</a> assertEquals(ROWKEYS.length, countRows()); -<a class="jxr_linenumber" name="908" href="#908">908</a> -<a class="jxr_linenumber" name="909" href="#909">909</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> -<a class="jxr_linenumber" name="910" href="#910">910</a> admin.flush(table); -<a class="jxr_linenumber" name="911" href="#911">911</a> -<a class="jxr_linenumber" name="912" href="#912">912</a> <strong class="jxr_keyword">try</strong>(RegionLocator rl = connection.getRegionLocator(tbl.getName())) { -<a class="jxr_linenumber" name="913" href="#913">913</a> HRegionLocation location = rl.getRegionLocation(Bytes.toBytes(<span class="jxr_string">"B"</span>)); -<a class="jxr_linenumber" name="914" href="#914">914</a> -<a class="jxr_linenumber" name="915" href="#915">915</a> HRegionInfo hri = location.getRegionInfo(); -<a class="jxr_linenumber" name="916" href="#916">916</a> -<a class="jxr_linenumber" name="917" href="#917">917</a> <em class="jxr_comment">// do a regular split</em> -<a class="jxr_linenumber" name="918" href="#918">918</a> byte[] regionName = location.getRegionInfo().getRegionName(); -<a class="jxr_linenumber" name="919" href="#919">919</a> admin.splitRegion(location.getRegionInfo().getRegionName(), Bytes.toBytes(<span class="jxr_string">"BM"</span>)); -<a class="jxr_linenumber" name="920" href="#920">920</a> TestEndToEndSplitTransaction.blockUntilRegionSplit(conf, 60000, regionName, <strong class="jxr_keyword">true</strong>); -<a class="jxr_linenumber" name="921" href="#921">921</a> -<a class="jxr_linenumber" name="922" href="#922">922</a> PairOfSameType<HRegionInfo> daughters = MetaTableAccessor.getDaughterRegions( -<a class="jxr_linenumber" name="923" href="#923">923</a> meta.get(<strong class="jxr_keyword">new</strong> Get(regionName))); -<a class="jxr_linenumber" name="924" href="#924">924</a> -<a class="jxr_linenumber" name="925" href="#925">925</a> <em class="jxr_comment">// Delete daughter regions from meta, but not hdfs, unassign it.</em> -<a class="jxr_linenumber" name="926" href="#926">926</a> -<a class="jxr_linenumber" name="927" href="#927">927</a> ServerName firstSN = -<a class="jxr_linenumber" name="928" href="#928">928</a> rl.getRegionLocation(daughters.getFirst().getStartKey()).getServerName(); -<a class="jxr_linenumber" name="929" href="#929">929</a> ServerName secondSN = -<a class="jxr_linenumber" name="930" href="#930">930</a> rl.getRegionLocation(daughters.getSecond().getStartKey()).getServerName(); -<a class="jxr_linenumber" name="931" href="#931">931</a> -<a class="jxr_linenumber" name="932" href="#932">932</a> undeployRegion(connection, firstSN, daughters.getFirst()); -<a class="jxr_linenumber" name="933" href="#933">933</a> undeployRegion(connection, secondSN, daughters.getSecond()); -<a class="jxr_linenumber" name="934" href="#934">934</a> -<a class="jxr_linenumber" name="935" href="#935">935</a> List<Delete> deletes = <strong class="jxr_keyword">new</strong> ArrayList<>(); -<a class="jxr_linenumber" name="936" href="#936">936</a> deletes.add(<strong class="jxr_keyword">new</strong> Delete(daughters.getFirst().getRegionName())); -<a class="jxr_linenumber" name="937" href="#937">937</a> deletes.add(<strong class="jxr_keyword">new</strong> Delete(daughters.getSecond().getRegionName())); -<a class="jxr_linenumber" name="938" href="#938">938</a> meta.delete(deletes); -<a class="jxr_linenumber" name="939" href="#939">939</a> -<a class="jxr_linenumber" name="940" href="#940">940</a> <em class="jxr_comment">// Remove daughters from regionStates</em> -<a class="jxr_linenumber" name="941" href="#941">941</a> RegionStates regionStates = TEST_UTIL.getMiniHBaseCluster().getMaster(). -<a class="jxr_linenumber" name="942" href="#942">942</a> getAssignmentManager().getRegionStates(); -<a class="jxr_linenumber" name="943" href="#943">943</a> regionStates.deleteRegion(daughters.getFirst()); -<a class="jxr_linenumber" name="944" href="#944">944</a> regionStates.deleteRegion(daughters.getSecond()); +<a class="jxr_linenumber" name="884" href="#884">884</a> <strong class="jxr_keyword">try</strong>(RegionLocator rl = connection.getRegionLocator(tbl.getName())) { +<a class="jxr_linenumber" name="885" href="#885">885</a> HRegionLocation location = rl.getRegionLocation(Bytes.toBytes(<span class="jxr_string">"B"</span>)); +<a class="jxr_linenumber" name="886" href="#886">886</a> +<a class="jxr_linenumber" name="887" href="#887">887</a> meta = connection.getTable(TableName.META_TABLE_NAME, tableExecutorService); +<a class="jxr_linenumber" name="888" href="#888">888</a> HRegionInfo hri = location.getRegionInfo(); +<a class="jxr_linenumber" name="889" href="#889">889</a> +<a class="jxr_linenumber" name="890" href="#890">890</a> <em class="jxr_comment">// do a regular split</em> +<a class="jxr_linenumber" name="891" href="#891">891</a> byte[] regionName = location.getRegionInfo().getRegionName(); +<a class="jxr_linenumber" name="892" href="#892">892</a> admin.splitRegion(location.getRegionInfo().getRegionName(), Bytes.toBytes(<span class="jxr_string">"BM"</span>)); +<a class="jxr_linenumber" name="893" href="#893">893</a> TestEndToEndSplitTransaction.blockUntilRegionSplit(conf, 60000, regionName, <strong class="jxr_keyword">true</strong>); +<a class="jxr_linenumber" name="894" href="#894">894</a> +<a class="jxr_linenumber" name="895" href="#895">895</a> <em class="jxr_comment">// TODO: fixHdfsHoles does not work against splits, since the parent dir lingers on</em> +<a class="jxr_linenumber" name="896" href="#896">896</a> <em class="jxr_comment">// for some time until children references are deleted. HBCK erroneously sees this as</em> +<a class="jxr_linenumber" name="897" href="#897">897</a> <em class="jxr_comment">// overlapping regions</em> +<a class="jxr_linenumber" name="898" href="#898">898</a> HBaseFsck hbck = doFsck(conf, <strong class="jxr_keyword">true</strong>, <strong class="jxr_keyword">true</strong>, false, false, false, <strong class="jxr_keyword">true</strong>, <strong class="jxr_keyword">true</strong>, <strong class="jxr_keyword">true</strong>, false, +<a class="jxr_linenumber" name="899" href="#899">899</a> false, false, <strong class="jxr_keyword">null</strong>); +<a class="jxr_linenumber" name="900" href="#900">900</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] {}); <em class="jxr_comment">//no LINGERING_SPLIT_PARENT reported</em> +<a class="jxr_linenumber" name="901" href="#901">901</a> +<a class="jxr_linenumber" name="902" href="#902">902</a> <em class="jxr_comment">// assert that the split hbase:meta entry is still there.</em> +<a class="jxr_linenumber" name="903" href="#903">903</a> Get get = <strong class="jxr_keyword">new</strong> Get(hri.getRegionName()); +<a class="jxr_linenumber" name="904" href="#904">904</a> Result result = meta.get(get); +<a class="jxr_linenumber" name="905" href="#905">905</a> assertNotNull(result); +<a class="jxr_linenumber" name="906" href="#906">906</a> assertNotNull(MetaTableAccessor.getHRegionInfo(result)); +<a class="jxr_linenumber" name="907" href="#907">907</a> +<a class="jxr_linenumber" name="908" href="#908">908</a> assertEquals(ROWKEYS.length, countRows()); +<a class="jxr_linenumber" name="909" href="#909">909</a> +<a class="jxr_linenumber" name="910" href="#910">910</a> <em class="jxr_comment">// assert that we still have the split regions</em> +<a class="jxr_linenumber" name="911" href="#911">911</a> assertEquals(rl.getStartKeys().length, SPLITS.length + 1 + 1); <em class="jxr_comment">//SPLITS + 1 is # regions</em> +<a class="jxr_linenumber" name="912" href="#912">912</a> <em class="jxr_comment">// pre-split.</em> +<a class="jxr_linenumber" name="913" href="#913">913</a> assertNoErrors(doFsck(conf, false)); +<a class="jxr_linenumber" name="914" href="#914">914</a> } +<a class="jxr_linenumber" name="915" href="#915">915</a> } <strong class="jxr_keyword">finally</strong> { +<a class="jxr_linenumber" name="916" href="#916">916</a> cleanupTable(table); +<a class="jxr_linenumber" name="917" href="#917">917</a> IOUtils.closeQuietly(meta); +<a class="jxr_linenumber" name="918" href="#918">918</a> } +<a class="jxr_linenumber" name="919" href="#919">919</a> } +<a class="jxr_linenumber" name="920" href="#920">920</a> +<a class="jxr_linenumber" name="921" href="#921">921</a> <em class="jxr_javadoccomment">/**</em> +<a class="jxr_linenumber" name="922" href="#922">922</a> <em class="jxr_javadoccomment"> * Split crashed after write to hbase:meta finished for the parent region, but</em> +<a class="jxr_linenumber" name="923" href="#923">923</a> <em class="jxr_javadoccomment"> * failed to write daughters (pre HBASE-7721 codebase)</em> +<a class="jxr_linenumber" name="924" href="#924">924</a> <em class="jxr_javadoccomment"> */</em> +<a class="jxr_linenumber" name="925" href="#925">925</a> @Test(timeout=75000) +<a class="jxr_linenumber" name="926" href="#926">926</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testSplitDaughtersNotInMeta() <strong class="jxr_keyword">throws</strong> Exception { +<a class="jxr_linenumber" name="927" href="#927">927</a> TableName table = TableName.valueOf(<span class="jxr_string">"testSplitdaughtersNotInMeta"</span>); +<a class="jxr_linenumber" name="928" href="#928">928</a> Table meta = connection.getTable(TableName.META_TABLE_NAME, tableExecutorService); +<a class="jxr_linenumber" name="929" href="#929">929</a> <strong class="jxr_keyword">try</strong> { +<a class="jxr_linenumber" name="930" href="#930">930</a> setupTable(table); +<a class="jxr_linenumber" name="931" href="#931">931</a> assertEquals(ROWKEYS.length, countRows()); +<a class="jxr_linenumber" name="932" href="#932">932</a> +<a class="jxr_linenumber" name="933" href="#933">933</a> <em class="jxr_comment">// make sure data in regions, if in wal only there is no data loss</em> +<a class="jxr_linenumber" name="934" href="#934">934</a> admin.flush(table); +<a class="jxr_linenumber" name="935" href="#935">935</a> +<a class="jxr_linenumber" name="936" href="#936">936</a> <strong class="jxr_keyword">try</strong>(RegionLocator rl = connection.getRegionLocator(tbl.getName())) { +<a class="jxr_linenumber" name="937" href="#937">937</a> HRegionLocation location = rl.getRegionLocation(Bytes.toBytes(<span class="jxr_string">"B"</span>)); +<a class="jxr_linenumber" name="938" href="#938">938</a> +<a class="jxr_linenumber" name="939" href="#939">939</a> HRegionInfo hri = location.getRegionInfo(); +<a class="jxr_linenumber" name="940" href="#940">940</a> +<a class="jxr_linenumber" name="941" href="#941">941</a> <em class="jxr_comment">// do a regular split</em> +<a class="jxr_linenumber" name="942" href="#942">942</a> byte[] regionName = location.getRegionInfo().getRegionName(); +<a class="jxr_linenumber" name="943" href="#943">943</a> admin.splitRegion(location.getRegionInfo().getRegionName(), Bytes.toBytes(<span class="jxr_string">"BM"</span>)); +<a class="jxr_linenumber" name="944" href="#944">944</a> TestEndToEndSplitTransaction.blockUntilRegionSplit(conf, 60000, regionName, <strong class="jxr_keyword">true</strong>); <a class="jxr_linenumber" name="945" href="#945">945</a> -<a class="jxr_linenumber" name="946" href="#946">946</a> HBaseFsck hbck = doFsck(conf, false); -<a class="jxr_linenumber" name="947" href="#947">947</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { -<a class="jxr_linenumber" name="948" href="#948">948</a> HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_META_OR_DEPLOYED, -<a class="jxr_linenumber" name="949" href="#949">949</a> HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_META_OR_DEPLOYED, -<a class="jxr_linenumber" name="950" href="#950">950</a> HBaseFsck.ErrorReporter.ERROR_CODE.HOLE_IN_REGION_CHAIN }); <em class="jxr_comment">//no LINGERING_SPLIT_PARENT</em> -<a class="jxr_linenumber" name="951" href="#951">951</a> -<a class="jxr_linenumber" name="952" href="#952">952</a> <em class="jxr_comment">// now fix it. The fix should not revert the region split, but add daughters to META</em> -<a class="jxr_linenumber" name="953" href="#953">953</a> hbck = doFsck(conf, <strong class="jxr_keyword">true</strong>, <strong class="jxr_keyword">true</strong>, false, false, false, false, false, false, false, -<a class="jxr_linenumber" name="954" href="#954">954</a> false, false, <strong class="jxr_keyword">null</strong>); -<a class="jxr_linenumber" name="955" href="#955">955</a> assertErrors(hbck, <strong class="jxr_keyword">new</strong> HBaseFsck.ErrorReporter.ERROR_CODE[] { -<a class="jxr_linenumber" name="956" href="#956">956</a> HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_META_OR_DEPLOYED, -<a class="jxr_linenumber" name="957" href="#957">957</a> HBaseFsck.ErrorReporter.ERROR_CODE.NOT_IN_META_OR_DEPLOYED, -<a class="jxr_linenumber" name="958" href="#958">958</a> HBaseFsck.ErrorReporter.ERROR_CODE.HOLE_IN_REGION_CHAIN }); -<a class="jxr_linenumber" name="959" href="#959">959</a> -<a class="jxr_linenumber" name="960" href="#960">960</a> <em class="jxr_comment">// assert that the split hbase:meta entry is still there.</em> -<a class="jxr_linenumber" name="961" href="#961">961</a> Get get = <strong class="jxr_keyword">new</strong> Get(hri.getRegionName()); -<a class="jxr_linenumber" name="962" href="#962">962</a> Result result = meta.get(get); -<a class="jxr_linenumber" name="963" href="#963">963</a> assertNotNull(result); -<a class="jxr_linenumber" name="964" href="#964">964</a> assertNotNull(MetaTableAccessor.getHRegionInfo(result)); -<a class="jxr_linenumber" name="965" href="#965">965</a> -<a class="jxr_linenumber" name="966" href="#966">966</a> assertEquals(ROWKEYS.length, countRows()); -<a class="jxr_linenumber" name="967" href="#967">967</a> -<a class="jxr_linenumber" name="968" href="#968">968</a> <em class="jxr_comment">// assert that we still have the split regions</em> -<a class="jxr_linenumber" name="969" href="#969">969</a> assertEquals(rl.getStartKeys().length, SPLITS.length + 1 + 1); <em class="jxr_comment">//SPLITS + 1 is # regions</em> -<a class="jxr_linenumber" name="970" href="#970">970</a> <em class="jxr_comment">// pre-split.</em> -<a class="jxr_linenumber" name="971" href="#971">971</a> assertNoErrors(doFsck(conf, false)); <em class="jxr_comment">//should be fixed by now</em> -<a class="jxr_linenumber" name="972" href="#972">972</a> } -<a class="jxr_linenumber" name="973" href="#973">973</a> } <strong class="jxr_keyword">finally</strong> { -<a class="jxr_linenumber" name="974" href="#974">974</a> meta.close(); -<a class="jxr_linenumber" name="975" href="#975">975</a> cleanupTable(table); -<a class="jxr_linenumber" name="976" href="#976">976</a> } -<a class="jxr_linenumber" name="977" href="#977">977</a> } -<a class="jxr_line
<TRUNCATED>
