Index: src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (revision 1196098) +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (working copy) @@ -2790,7 +2790,19 @@ */ public void bulkLoadHFiles(List> familyPaths) throws IOException { - startBulkRegionOperation(); + boolean writeLockNeeded = false; + byte[] family = null; + for (Pair pair : familyPaths) { + byte[] fam = pair.getFirst(); + if (family == null) { + family = fam; + } else if (!Bytes.equals(family, fam)) { + // we need writeLock for multi-famlity bulk load + writeLockNeeded = true; + break; + } + } + startBulkRegionOperation(writeLockNeeded); this.writeRequestsCount.increment(); List ioes = new ArrayList(); List> failures = new ArrayList>(); @@ -4453,12 +4465,14 @@ * Acquires a writelock and checks if the region is closing or closed. * @throws NotServingRegionException when the region is closing or closed */ - private void startBulkRegionOperation() throws NotServingRegionException { + private void startBulkRegionOperation(boolean writeLockNeeded) + throws NotServingRegionException { if (this.closing.get()) { throw new NotServingRegionException(regionInfo.getRegionNameAsString() + " is closing"); } - lock.writeLock().lock(); + if (writeLockNeeded) lock.writeLock().lock(); + else lock.readLock().lock(); if (this.closed.get()) { lock.writeLock().unlock(); throw new NotServingRegionException(regionInfo.getRegionNameAsString() + @@ -4471,7 +4485,8 @@ * to the try block of #startRegionOperation */ private void closeBulkRegionOperation(){ - lock.writeLock().unlock(); + if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock(); + else lock.readLock().unlock(); } /**