http://git-wip-us.apache.org/repos/asf/hbase-site/blob/738e976e/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
----------------------------------------------------------------------
diff --git 
a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html 
b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
index 34b8b52..3f9d8d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
@@ -935,7 +935,7 @@
 <span class="sourceLineNo">927</span>          
storeEngine.getStoreFileManager().clearCompactedFiles();<a name="line.927"></a>
 <span class="sourceLineNo">928</span>      // clear the compacted files<a 
name="line.928"></a>
 <span class="sourceLineNo">929</span>      if 
(CollectionUtils.isNotEmpty(compactedfiles)) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        
removeCompactedfiles(compactedfiles);<a name="line.930"></a>
+<span class="sourceLineNo">930</span>        
removeCompactedfiles(compactedfiles, true);<a name="line.930"></a>
 <span class="sourceLineNo">931</span>      }<a name="line.931"></a>
 <span class="sourceLineNo">932</span>      if (!result.isEmpty()) {<a 
name="line.932"></a>
 <span class="sourceLineNo">933</span>        // initialize the thread pool for 
closing store files in parallel.<a name="line.933"></a>
@@ -2583,190 +2583,221 @@
 <span class="sourceLineNo">2575</span>   * Closes and archives the compacted 
files under this store<a name="line.2575"></a>
 <span class="sourceLineNo">2576</span>   */<a name="line.2576"></a>
 <span class="sourceLineNo">2577</span>  public synchronized void 
closeAndArchiveCompactedFiles() throws IOException {<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    // ensure other threads do not 
attempt to archive the same files on close()<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    archiveLock.lock();<a 
name="line.2579"></a>
-<span class="sourceLineNo">2580</span>    try {<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      lock.readLock().lock();<a 
name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      Collection&lt;HStoreFile&gt; 
copyCompactedfiles = null;<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>      try {<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span>        Collection&lt;HStoreFile&gt; 
compactedfiles =<a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>            
this.getStoreEngine().getStoreFileManager().getCompactedfiles();<a 
name="line.2585"></a>
-<span class="sourceLineNo">2586</span>        if 
(CollectionUtils.isNotEmpty(compactedfiles)) {<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>          // Do a copy under read lock<a 
name="line.2587"></a>
-<span class="sourceLineNo">2588</span>          copyCompactedfiles = new 
ArrayList&lt;&gt;(compactedfiles);<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>        } else {<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>          LOG.trace("No compacted files 
to archive");<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>        }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span>      } finally {<a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>        lock.readLock().unlock();<a 
name="line.2593"></a>
-<span class="sourceLineNo">2594</span>      }<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>      if 
(CollectionUtils.isNotEmpty(copyCompactedfiles)) {<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>        
removeCompactedfiles(copyCompactedfiles);<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span>      }<a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    } finally {<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>      archiveLock.unlock();<a 
name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    }<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
-<span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>  /**<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>   * Archives and removes the compacted 
files<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span>   * @param compactedfiles The compacted 
files in this store that are not active in reads<a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>   */<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  private void 
removeCompactedfiles(Collection&lt;HStoreFile&gt; compactedfiles)<a 
name="line.2607"></a>
-<span class="sourceLineNo">2608</span>      throws IOException {<a 
name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    final List&lt;HStoreFile&gt; 
filesToRemove = new ArrayList&lt;&gt;(compactedfiles.size());<a 
name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    final List&lt;Long&gt; 
storeFileSizes = new ArrayList&lt;&gt;(compactedfiles.size());<a 
name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    for (final HStoreFile file : 
compactedfiles) {<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>      synchronized (file) {<a 
name="line.2612"></a>
-<span class="sourceLineNo">2613</span>        try {<a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>          StoreFileReader r = 
file.getReader();<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>          if (r == null) {<a 
name="line.2615"></a>
-<span class="sourceLineNo">2616</span>            LOG.debug("The file {} was 
closed but still not archived", file);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>            // HACK: Temporarily re-open 
the reader so we can get the size of the file. Ideally,<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>            // we should know the size 
of an HStoreFile without having to ask the HStoreFileReader<a 
name="line.2618"></a>
-<span class="sourceLineNo">2619</span>            // for that.<a 
name="line.2619"></a>
-<span class="sourceLineNo">2620</span>            long length = 
getStoreFileSize(file);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>            filesToRemove.add(file);<a 
name="line.2621"></a>
-<span class="sourceLineNo">2622</span>            
storeFileSizes.add(length);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>            continue;<a 
name="line.2623"></a>
-<span class="sourceLineNo">2624</span>          }<a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>          if (file.isCompactedAway() 
&amp;&amp; !file.isReferencedInReads()) {<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>            // Even if deleting fails we 
need not bother as any new scanners won't be<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>            // able to use the compacted 
file as the status is already compactedAway<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>            LOG.trace("Closing and 
archiving the file {}", file);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>            // Copy the file size before 
closing the reader<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>            final long length = 
r.length();<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>            r.close(true);<a 
name="line.2631"></a>
-<span class="sourceLineNo">2632</span>            // Just close and return<a 
name="line.2632"></a>
-<span class="sourceLineNo">2633</span>            filesToRemove.add(file);<a 
name="line.2633"></a>
-<span class="sourceLineNo">2634</span>            // Only add the length if we 
successfully added the file to `filesToRemove`<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>            
storeFileSizes.add(length);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>          } else {<a 
name="line.2636"></a>
-<span class="sourceLineNo">2637</span>            LOG.info("Can't archive 
compacted file " + file.getPath()<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>                + " because of either 
isCompactedAway = " + file.isCompactedAway()<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span>                + " or file has 
reference, isReferencedInReads = " + file.isReferencedInReads()<a 
name="line.2639"></a>
-<span class="sourceLineNo">2640</span>                + ", skipping for 
now.");<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>          }<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>        } catch (Exception e) {<a 
name="line.2642"></a>
-<span class="sourceLineNo">2643</span>          LOG.error("Exception while 
trying to close the compacted store file {}",<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>            file.getPath(), e);<a 
name="line.2644"></a>
-<span class="sourceLineNo">2645</span>        }<a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>      }<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    }<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    if (this.isPrimaryReplicaStore()) 
{<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>      // Only the primary region is 
allowed to move the file to archive.<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>      // The secondary region does not 
move the files to archive. Any active reads from<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>      // the secondary region will still 
work because the file as such has active readers on it.<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>      if (!filesToRemove.isEmpty()) {<a 
name="line.2652"></a>
-<span class="sourceLineNo">2653</span>        LOG.debug("Moving the files {} 
to archive", filesToRemove);<a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>        // Only if this is successful it 
has to be removed<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>        try {<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>          
this.fs.removeStoreFiles(this.getColumnFamilyDescriptor().getNameAsString(), 
filesToRemove);<a name="line.2656"></a>
-<span class="sourceLineNo">2657</span>        } catch (FailedArchiveException 
fae) {<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>          // Even if archiving some 
files failed, we still need to clear out any of the<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>          // files which were 
successfully archived.  Otherwise we will receive a<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>          // FileNotFoundException when 
we attempt to re-archive them in the next go around.<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>          Collection&lt;Path&gt; 
failedFiles = fae.getFailedFiles();<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span>          Iterator&lt;HStoreFile&gt; 
iter = filesToRemove.iterator();<a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>          Iterator&lt;Long&gt; sizeIter 
= storeFileSizes.iterator();<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>          while (iter.hasNext()) {<a 
name="line.2664"></a>
-<span class="sourceLineNo">2665</span>            sizeIter.next();<a 
name="line.2665"></a>
-<span class="sourceLineNo">2666</span>            if 
(failedFiles.contains(iter.next().getPath())) {<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>              iter.remove();<a 
name="line.2667"></a>
-<span class="sourceLineNo">2668</span>              sizeIter.remove();<a 
name="line.2668"></a>
-<span class="sourceLineNo">2669</span>            }<a name="line.2669"></a>
+<span class="sourceLineNo">2578</span>    
closeAndArchiveCompactedFiles(false);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>  }<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span><a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>  @VisibleForTesting<a 
name="line.2581"></a>
+<span class="sourceLineNo">2582</span>  public synchronized void 
closeAndArchiveCompactedFiles(boolean storeClosing) throws IOException {<a 
name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    // ensure other threads do not 
attempt to archive the same files on close()<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    archiveLock.lock();<a 
name="line.2584"></a>
+<span class="sourceLineNo">2585</span>    try {<a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>      lock.readLock().lock();<a 
name="line.2586"></a>
+<span class="sourceLineNo">2587</span>      Collection&lt;HStoreFile&gt; 
copyCompactedfiles = null;<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>      try {<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>        Collection&lt;HStoreFile&gt; 
compactedfiles =<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>            
this.getStoreEngine().getStoreFileManager().getCompactedfiles();<a 
name="line.2590"></a>
+<span class="sourceLineNo">2591</span>        if 
(CollectionUtils.isNotEmpty(compactedfiles)) {<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>          // Do a copy under read lock<a 
name="line.2592"></a>
+<span class="sourceLineNo">2593</span>          copyCompactedfiles = new 
ArrayList&lt;&gt;(compactedfiles);<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span>        } else {<a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>          LOG.trace("No compacted files 
to archive");<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>        }<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>      } finally {<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>        lock.readLock().unlock();<a 
name="line.2598"></a>
+<span class="sourceLineNo">2599</span>      }<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>      if 
(CollectionUtils.isNotEmpty(copyCompactedfiles)) {<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>        
removeCompactedfiles(copyCompactedfiles, storeClosing);<a name="line.2601"></a>
+<span class="sourceLineNo">2602</span>      }<a name="line.2602"></a>
+<span class="sourceLineNo">2603</span>    } finally {<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>      archiveLock.unlock();<a 
name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    }<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>  }<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>  /**<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>   * Archives and removes the compacted 
files<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>   * @param compactedfiles The compacted 
files in this store that are not active in reads<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>   */<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span>  private void 
removeCompactedfiles(Collection&lt;HStoreFile&gt; compactedfiles, boolean 
storeClosing)<a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>      throws IOException {<a 
name="line.2613"></a>
+<span class="sourceLineNo">2614</span>    final List&lt;HStoreFile&gt; 
filesToRemove = new ArrayList&lt;&gt;(compactedfiles.size());<a 
name="line.2614"></a>
+<span class="sourceLineNo">2615</span>    final List&lt;Long&gt; 
storeFileSizes = new ArrayList&lt;&gt;(compactedfiles.size());<a 
name="line.2615"></a>
+<span class="sourceLineNo">2616</span>    for (final HStoreFile file : 
compactedfiles) {<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>      synchronized (file) {<a 
name="line.2617"></a>
+<span class="sourceLineNo">2618</span>        try {<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>          StoreFileReader r = 
file.getReader();<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>          if (r == null) {<a 
name="line.2620"></a>
+<span class="sourceLineNo">2621</span>            LOG.debug("The file {} was 
closed but still not archived", file);<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>            // HACK: Temporarily re-open 
the reader so we can get the size of the file. Ideally,<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span>            // we should know the size 
of an HStoreFile without having to ask the HStoreFileReader<a 
name="line.2623"></a>
+<span class="sourceLineNo">2624</span>            // for that.<a 
name="line.2624"></a>
+<span class="sourceLineNo">2625</span>            long length = 
getStoreFileSize(file);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>            filesToRemove.add(file);<a 
name="line.2626"></a>
+<span class="sourceLineNo">2627</span>            
storeFileSizes.add(length);<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>            continue;<a 
name="line.2628"></a>
+<span class="sourceLineNo">2629</span>          }<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span><a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>          //Compacted files in the list 
should always be marked compacted away. In the event<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>          //they're contradicting in 
order to guarantee data consistency<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>          //should we choose one and 
ignore the other?<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span>          if (storeClosing &amp;&amp; 
!file.isCompactedAway()) {<a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>            String msg =<a 
name="line.2635"></a>
+<span class="sourceLineNo">2636</span>                "Region closing but 
StoreFile is in compacted list but not compacted away: " +<a 
name="line.2636"></a>
+<span class="sourceLineNo">2637</span>                
file.getPath().getName();<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>            throw new 
IllegalStateException(msg);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>          }<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span><a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>          //If store is closing we're 
ignoring any references to keep things consistent<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>          //and remove compacted 
storefiles from the region directory<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>          if (file.isCompactedAway() 
&amp;&amp; (!file.isReferencedInReads() || storeClosing)) {<a 
name="line.2643"></a>
+<span class="sourceLineNo">2644</span>            if (storeClosing &amp;&amp; 
file.isReferencedInReads()) {<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>              LOG.debug("Region closing 
but StoreFile still has references: {}",<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>                  
file.getPath().getName());<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>            }<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>            // Even if deleting fails we 
need not bother as any new scanners won't be<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span>            // able to use the compacted 
file as the status is already compactedAway<a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>            LOG.trace("Closing and 
archiving the file {}", file);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>            // Copy the file size before 
closing the reader<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>            final long length = 
r.length();<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>            r.close(true);<a 
name="line.2653"></a>
+<span class="sourceLineNo">2654</span>            
file.closeStreamReaders(true);<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span>            // Just close and return<a 
name="line.2655"></a>
+<span class="sourceLineNo">2656</span>            filesToRemove.add(file);<a 
name="line.2656"></a>
+<span class="sourceLineNo">2657</span>            // Only add the length if we 
successfully added the file to `filesToRemove`<a name="line.2657"></a>
+<span class="sourceLineNo">2658</span>            
storeFileSizes.add(length);<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>          } else {<a 
name="line.2659"></a>
+<span class="sourceLineNo">2660</span>            LOG.info("Can't archive 
compacted file " + file.getPath()<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>                + " because of either 
isCompactedAway = " + file.isCompactedAway()<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>                + " or file has 
reference, isReferencedInReads = " + file.isReferencedInReads()<a 
name="line.2662"></a>
+<span class="sourceLineNo">2663</span>                + ", skipping for 
now.");<a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>          }<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>        } catch (Exception e) {<a 
name="line.2665"></a>
+<span class="sourceLineNo">2666</span>          String msg = "Exception while 
trying to close the compacted store file " +<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>              
file.getPath().getName();<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>          if (storeClosing) {<a 
name="line.2668"></a>
+<span class="sourceLineNo">2669</span>            msg = "Store is closing. " + 
msg;<a name="line.2669"></a>
 <span class="sourceLineNo">2670</span>          }<a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>          if (!filesToRemove.isEmpty()) 
{<a name="line.2671"></a>
-<span class="sourceLineNo">2672</span>            
clearCompactedfiles(filesToRemove);<a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>          }<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>          throw fae;<a 
name="line.2674"></a>
-<span class="sourceLineNo">2675</span>        }<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>      }<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    }<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    if (!filesToRemove.isEmpty()) {<a 
name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      // Clear the compactedfiles from 
the store file manager<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>      
clearCompactedfiles(filesToRemove);<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      // Try to send report of this 
archival to the Master for updating quota usage faster<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>      
reportArchivedFilesForQuota(filesToRemove, storeFileSizes);<a 
name="line.2682"></a>
-<span class="sourceLineNo">2683</span>    }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span>  }<a name="line.2684"></a>
-<span class="sourceLineNo">2685</span><a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  /**<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>   * Computes the length of a store file 
without succumbing to any errors along the way. If an<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>   * error is encountered, the 
implementation returns {@code 0} instead of the actual size.<a 
name="line.2688"></a>
-<span class="sourceLineNo">2689</span>   *<a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>   * @param file The file to compute the 
size of.<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span>   * @return The size in bytes of the 
provided {@code file}.<a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>   */<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>  long getStoreFileSize(HStoreFile file) 
{<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    long length = 0;<a 
name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    try {<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>      file.initReader();<a 
name="line.2696"></a>
-<span class="sourceLineNo">2697</span>      length = 
file.getReader().length();<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>    } catch (IOException e) {<a 
name="line.2698"></a>
-<span class="sourceLineNo">2699</span>      LOG.trace("Failed to open reader 
when trying to compute store file size, ignoring", e);<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>    } finally {<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>      try {<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>        file.closeStoreFile(<a 
name="line.2702"></a>
-<span class="sourceLineNo">2703</span>            file.getCacheConf() != null 
? file.getCacheConf().shouldEvictOnClose() : true);<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span>      } catch (IOException e) {<a 
name="line.2704"></a>
-<span class="sourceLineNo">2705</span>        LOG.trace("Failed to close 
reader after computing store file size, ignoring", e);<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>      }<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    }<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    return length;<a 
name="line.2708"></a>
-<span class="sourceLineNo">2709</span>  }<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span><a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>  public Long preFlushSeqIDEstimation() 
{<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span>    return 
memstore.preFlushSeqIDEstimation();<a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
-<span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>  @Override<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>  public boolean isSloppyMemStore() {<a 
name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    return this.memstore.isSloppy();<a 
name="line.2717"></a>
-<span class="sourceLineNo">2718</span>  }<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span><a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>  private void 
clearCompactedfiles(List&lt;HStoreFile&gt; filesToRemove) throws IOException 
{<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    LOG.trace("Clearing the compacted 
file {} from this store", filesToRemove);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    try {<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>      lock.writeLock().lock();<a 
name="line.2723"></a>
-<span class="sourceLineNo">2724</span>      
this.getStoreEngine().getStoreFileManager().removeCompactedFiles(filesToRemove);<a
 name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    } finally {<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>      lock.writeLock().unlock();<a 
name="line.2726"></a>
-<span class="sourceLineNo">2727</span>    }<a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>  }<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span><a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>  void 
reportArchivedFilesForQuota(List&lt;? extends StoreFile&gt; archivedFiles, 
List&lt;Long&gt; fileSizes) {<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    // Sanity check from the caller<a 
name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    if (archivedFiles.size() != 
fileSizes.size()) {<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>      throw new RuntimeException("Coding 
error: should never see lists of varying size");<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    }<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    RegionServerServices rss = 
this.region.getRegionServerServices();<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span>    if (rss == null) {<a 
name="line.2736"></a>
-<span class="sourceLineNo">2737</span>      return;<a name="line.2737"></a>
+<span class="sourceLineNo">2671</span>          LOG.error(msg, e);<a 
name="line.2671"></a>
+<span class="sourceLineNo">2672</span>          //if we get an exception let 
caller know so it can abort the server<a name="line.2672"></a>
+<span class="sourceLineNo">2673</span>          if (storeClosing) {<a 
name="line.2673"></a>
+<span class="sourceLineNo">2674</span>            throw new IOException(msg, 
e);<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>          }<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>        }<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>      }<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    }<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    if (this.isPrimaryReplicaStore()) 
{<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span>      // Only the primary region is 
allowed to move the file to archive.<a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>      // The secondary region does not 
move the files to archive. Any active reads from<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span>      // the secondary region will still 
work because the file as such has active readers on it.<a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>      if (!filesToRemove.isEmpty()) {<a 
name="line.2683"></a>
+<span class="sourceLineNo">2684</span>        LOG.debug("Moving the files {} 
to archive", filesToRemove);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>        // Only if this is successful it 
has to be removed<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>        try {<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>          
this.fs.removeStoreFiles(this.getColumnFamilyDescriptor().getNameAsString(), 
filesToRemove);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>        } catch (FailedArchiveException 
fae) {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>          // Even if archiving some 
files failed, we still need to clear out any of the<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>          // files which were 
successfully archived.  Otherwise we will receive a<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>          // FileNotFoundException when 
we attempt to re-archive them in the next go around.<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>          Collection&lt;Path&gt; 
failedFiles = fae.getFailedFiles();<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>          Iterator&lt;HStoreFile&gt; 
iter = filesToRemove.iterator();<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span>          Iterator&lt;Long&gt; sizeIter 
= storeFileSizes.iterator();<a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>          while (iter.hasNext()) {<a 
name="line.2695"></a>
+<span class="sourceLineNo">2696</span>            sizeIter.next();<a 
name="line.2696"></a>
+<span class="sourceLineNo">2697</span>            if 
(failedFiles.contains(iter.next().getPath())) {<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>              iter.remove();<a 
name="line.2698"></a>
+<span class="sourceLineNo">2699</span>              sizeIter.remove();<a 
name="line.2699"></a>
+<span class="sourceLineNo">2700</span>            }<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span>          }<a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>          if (!filesToRemove.isEmpty()) 
{<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>            
clearCompactedfiles(filesToRemove);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>          }<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>          throw fae;<a 
name="line.2705"></a>
+<span class="sourceLineNo">2706</span>        }<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>      }<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>    }<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    if (!filesToRemove.isEmpty()) {<a 
name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      // Clear the compactedfiles from 
the store file manager<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>      
clearCompactedfiles(filesToRemove);<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>      // Try to send report of this 
archival to the Master for updating quota usage faster<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>      
reportArchivedFilesForQuota(filesToRemove, storeFileSizes);<a 
name="line.2713"></a>
+<span class="sourceLineNo">2714</span>    }<a name="line.2714"></a>
+<span class="sourceLineNo">2715</span>  }<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span><a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>  /**<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>   * Computes the length of a store file 
without succumbing to any errors along the way. If an<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>   * error is encountered, the 
implementation returns {@code 0} instead of the actual size.<a 
name="line.2719"></a>
+<span class="sourceLineNo">2720</span>   *<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>   * @param file The file to compute the 
size of.<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span>   * @return The size in bytes of the 
provided {@code file}.<a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>   */<a name="line.2723"></a>
+<span class="sourceLineNo">2724</span>  long getStoreFileSize(HStoreFile file) 
{<a name="line.2724"></a>
+<span class="sourceLineNo">2725</span>    long length = 0;<a 
name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    try {<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>      file.initReader();<a 
name="line.2727"></a>
+<span class="sourceLineNo">2728</span>      length = 
file.getReader().length();<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    } catch (IOException e) {<a 
name="line.2729"></a>
+<span class="sourceLineNo">2730</span>      LOG.trace("Failed to open reader 
when trying to compute store file size, ignoring", e);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    } finally {<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>      try {<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>        file.closeStoreFile(<a 
name="line.2733"></a>
+<span class="sourceLineNo">2734</span>            file.getCacheConf() != null 
? file.getCacheConf().shouldEvictOnClose() : true);<a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>      } catch (IOException e) {<a 
name="line.2735"></a>
+<span class="sourceLineNo">2736</span>        LOG.trace("Failed to close 
reader after computing store file size, ignoring", e);<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span>      }<a name="line.2737"></a>
 <span class="sourceLineNo">2738</span>    }<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    List&lt;Entry&lt;String,Long&gt;&gt; 
filesWithSizes = new ArrayList&lt;&gt;(archivedFiles.size());<a 
name="line.2739"></a>
-<span class="sourceLineNo">2740</span>    Iterator&lt;Long&gt; fileSizeIter = 
fileSizes.iterator();<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span>    for (StoreFile storeFile : 
archivedFiles) {<a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>      final long fileSize = 
fileSizeIter.next();<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>      if (storeFile.isHFile() &amp;&amp; 
fileSize != 0) {<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>        
filesWithSizes.add(Maps.immutableEntry(storeFile.getPath().getName(), 
fileSize));<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>      }<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>    }<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>    if (LOG.isTraceEnabled()) {<a 
name="line.2747"></a>
-<span class="sourceLineNo">2748</span>      LOG.trace("Files archived: " + 
archivedFiles + ", reporting the following to the Master: "<a 
name="line.2748"></a>
-<span class="sourceLineNo">2749</span>          + filesWithSizes);<a 
name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    }<a name="line.2750"></a>
-<span class="sourceLineNo">2751</span>    boolean success = 
rss.reportFileArchivalForQuotas(getTableName(), filesWithSizes);<a 
name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    if (!success) {<a 
name="line.2752"></a>
-<span class="sourceLineNo">2753</span>      LOG.warn("Failed to report 
archival of files: " + filesWithSizes);<a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    }<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>  }<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span><a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>  public int 
getCurrentParallelPutCount() {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>    return 
currentParallelPutCount.get();<a name="line.2758"></a>
+<span class="sourceLineNo">2739</span>    return length;<a 
name="line.2739"></a>
+<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span><a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>  public Long preFlushSeqIDEstimation() 
{<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    return 
memstore.preFlushSeqIDEstimation();<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>  }<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span><a name="line.2745"></a>
+<span class="sourceLineNo">2746</span>  @Override<a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>  public boolean isSloppyMemStore() {<a 
name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    return this.memstore.isSloppy();<a 
name="line.2748"></a>
+<span class="sourceLineNo">2749</span>  }<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span><a name="line.2750"></a>
+<span class="sourceLineNo">2751</span>  private void 
clearCompactedfiles(List&lt;HStoreFile&gt; filesToRemove) throws IOException 
{<a name="line.2751"></a>
+<span class="sourceLineNo">2752</span>    LOG.trace("Clearing the compacted 
file {} from this store", filesToRemove);<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>    try {<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>      lock.writeLock().lock();<a 
name="line.2754"></a>
+<span class="sourceLineNo">2755</span>      
this.getStoreEngine().getStoreFileManager().removeCompactedFiles(filesToRemove);<a
 name="line.2755"></a>
+<span class="sourceLineNo">2756</span>    } finally {<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>      lock.writeLock().unlock();<a 
name="line.2757"></a>
+<span class="sourceLineNo">2758</span>    }<a name="line.2758"></a>
 <span class="sourceLineNo">2759</span>  }<a name="line.2759"></a>
 <span class="sourceLineNo">2760</span><a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>}<a name="line.2761"></a>
+<span class="sourceLineNo">2761</span>  void 
reportArchivedFilesForQuota(List&lt;? extends StoreFile&gt; archivedFiles, 
List&lt;Long&gt; fileSizes) {<a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    // Sanity check from the caller<a 
name="line.2762"></a>
+<span class="sourceLineNo">2763</span>    if (archivedFiles.size() != 
fileSizes.size()) {<a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>      throw new RuntimeException("Coding 
error: should never see lists of varying size");<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    }<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>    RegionServerServices rss = 
this.region.getRegionServerServices();<a name="line.2766"></a>
+<span class="sourceLineNo">2767</span>    if (rss == null) {<a 
name="line.2767"></a>
+<span class="sourceLineNo">2768</span>      return;<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>    }<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    List&lt;Entry&lt;String,Long&gt;&gt; 
filesWithSizes = new ArrayList&lt;&gt;(archivedFiles.size());<a 
name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    Iterator&lt;Long&gt; fileSizeIter = 
fileSizes.iterator();<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    for (StoreFile storeFile : 
archivedFiles) {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      final long fileSize = 
fileSizeIter.next();<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      if (storeFile.isHFile() &amp;&amp; 
fileSize != 0) {<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>        
filesWithSizes.add(Maps.immutableEntry(storeFile.getPath().getName(), 
fileSize));<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      }<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    }<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>    if (LOG.isTraceEnabled()) {<a 
name="line.2778"></a>
+<span class="sourceLineNo">2779</span>      LOG.trace("Files archived: " + 
archivedFiles + ", reporting the following to the Master: "<a 
name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + filesWithSizes);<a 
name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>    boolean success = 
rss.reportFileArchivalForQuotas(getTableName(), filesWithSizes);<a 
name="line.2782"></a>
+<span class="sourceLineNo">2783</span>    if (!success) {<a 
name="line.2783"></a>
+<span class="sourceLineNo">2784</span>      LOG.warn("Failed to report 
archival of files: " + filesWithSizes);<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>    }<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>  }<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span><a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>  public int 
getCurrentParallelPutCount() {<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    return 
currentParallelPutCount.get();<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>  }<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span><a name="line.2791"></a>
+<span class="sourceLineNo">2792</span>}<a name="line.2792"></a>
 
 
 

Reply via email to