Return-Path: X-Original-To: apmail-hbase-commits-archive@www.apache.org Delivered-To: apmail-hbase-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id C1BA89A6D for ; Mon, 2 Apr 2012 20:48:47 +0000 (UTC) Received: (qmail 40917 invoked by uid 500); 2 Apr 2012 20:48:47 -0000 Delivered-To: apmail-hbase-commits-archive@hbase.apache.org Received: (qmail 40883 invoked by uid 500); 2 Apr 2012 20:48:47 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 40872 invoked by uid 99); 2 Apr 2012 20:48:47 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 02 Apr 2012 20:48:47 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 02 Apr 2012 20:48:44 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 01E692388A2C for ; Mon, 2 Apr 2012 20:48:23 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1308545 - in /hbase/trunk/src: main/java/org/apache/hadoop/hbase/regionserver/ test/java/org/apache/hadoop/hbase/regionserver/ Date: Mon, 02 Apr 2012 20:48:22 -0000 To: commits@hbase.apache.org From: stack@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120402204823.01E692388A2C@eris.apache.org> Author: stack Date: Mon Apr 2 20:48:22 2012 New Revision: 1308545 URL: http://svn.apache.org/viewvc?rev=1308545&view=rev Log: HBASE-5665 Repeated split causes HRegionServer failures and breaks table Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1308545&r1=1308544&r2=1308545&view=diff ============================================================================== --- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original) +++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Mon Apr 2 20:48:22 2012 @@ -846,6 +846,16 @@ public class HRegion implements HeapSize return this.closing.get(); } + /** @return true if region is available (not closed and not closing) */ + public boolean isAvailable() { + return !isClosed() && !isClosing(); + } + + /** @return true if region is splittable */ + public boolean isSplittable() { + return isAvailable() && !hasReferences(); + } + boolean areWritesEnabled() { synchronized(this.writestate) { return this.writestate.writesEnabled; Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1308545&r1=1308544&r2=1308545&view=diff ============================================================================== --- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original) +++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Mon Apr 2 20:48:22 2012 @@ -1914,8 +1914,7 @@ public class HRegionServer implements HR try { for (Map.Entry e: this.onlineRegions.entrySet()) { HRegion r = e.getValue(); - if (!r.getRegionInfo().isMetaRegion()) { - if (r.isClosed() || r.isClosing()) continue; + if (!r.getRegionInfo().isMetaRegion() && r.isAvailable()) { // Don't update zk with this close transition; pass false. closeRegion(r.getRegionInfo(), abort, false); } @@ -3135,7 +3134,7 @@ public class HRegionServer implements HR protected HRegionInfo[] getMostLoadedRegions() { ArrayList regions = new ArrayList(); for (HRegion r : onlineRegions.values()) { - if (r.isClosed() || r.isClosing()) { + if (!r.isAvailable()) { continue; } if (regions.size() < numRegionsToReport) { Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java?rev=1308545&r1=1308544&r2=1308545&view=diff ============================================================================== --- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java (original) +++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java Mon Apr 2 20:48:22 2012 @@ -163,7 +163,7 @@ public class SplitTransaction { * false if it is not (e.g. its already closed, etc.). */ public boolean prepare() { - if (this.parent.isClosed() || this.parent.isClosing()) return false; + if (!this.parent.isSplittable()) return false; // Split key can be null if this region is unsplittable; i.e. has refs. if (this.splitrow == null) return false; HRegionInfo hri = this.parent.getRegionInfo(); Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java?rev=1308545&r1=1308544&r2=1308545&view=diff ============================================================================== --- hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java (original) +++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java Mon Apr 2 20:48:22 2012 @@ -19,6 +19,8 @@ */ package org.apache.hadoop.hbase.regionserver; +import com.google.common.collect.ImmutableList; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -138,6 +140,28 @@ public class TestSplitTransaction { } /** + * Pass a reference store + */ + @Test public void testPrepareWithRegionsWithReference() throws IOException { + // create a mock that will act as a reference StoreFile + StoreFile storeFileMock = Mockito.mock(StoreFile.class); + when(storeFileMock.isReference()).thenReturn(true); + + // add the mock to the parent stores + Store storeMock = Mockito.mock(Store.class); + List storeFileList = new ArrayList(1); + storeFileList.add(storeFileMock); + when(storeMock.getStorefiles()).thenReturn(storeFileList); + when(storeMock.close()).thenReturn(ImmutableList.copyOf(storeFileList)); + this.parent.stores.put(Bytes.toBytes(""), storeMock); + + SplitTransaction st = new SplitTransaction(this.parent, GOOD_SPLIT_ROW); + + assertFalse("a region should not be splittable if it has instances of store file references", + st.prepare()); + } + + /** * Pass an unreasonable split row. */ @Test public void testPrepareWithBadSplitRow() throws IOException {