You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2018/09/17 14:53:41 UTC

[15/40] hbase-site git commit: Published site at 6d7bc0e98b25215e79f67f107fd0d3306dfcf352.

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/738e976e/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
index e074a8c..8cc5add 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
@@ -722,172 +722,172 @@
 <span class="sourceLineNo">714</span>      "hbase.regionserver.kerberos.principal", host);<a name="line.714"></a>
 <span class="sourceLineNo">715</span>  }<a name="line.715"></a>
 <span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>  protected void waitForMasterActive() {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
-<span class="sourceLineNo">720</span>  protected String getProcessName() {<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    return REGIONSERVER;<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  }<a name="line.722"></a>
+<span class="sourceLineNo">717</span><a name="line.717"></a>
+<span class="sourceLineNo">718</span>  /**<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * Wait for an active Master.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   * See override in Master superclass for how it is used.<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  protected void waitForMasterActive() {}<a name="line.722"></a>
 <span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>  protected boolean canCreateBaseZNode() {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    return this.masterless;<a name="line.725"></a>
+<span class="sourceLineNo">724</span>  protected String getProcessName() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    return REGIONSERVER;<a name="line.725"></a>
 <span class="sourceLineNo">726</span>  }<a name="line.726"></a>
 <span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>  protected boolean canUpdateTableDescriptor() {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    return false;<a name="line.729"></a>
+<span class="sourceLineNo">728</span>  protected boolean canCreateBaseZNode() {<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    return this.masterless;<a name="line.729"></a>
 <span class="sourceLineNo">730</span>  }<a name="line.730"></a>
 <span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>  protected RSRpcServices createRpcServices() throws IOException {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    return new RSRpcServices(this);<a name="line.733"></a>
+<span class="sourceLineNo">732</span>  protected boolean canUpdateTableDescriptor() {<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    return false;<a name="line.733"></a>
 <span class="sourceLineNo">734</span>  }<a name="line.734"></a>
 <span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>  protected void configureInfoServer() {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    infoServer.addServlet("rs-status", "/rs-status", RSStatusServlet.class);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    infoServer.setAttribute(REGIONSERVER, this);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  protected Class&lt;? extends HttpServlet&gt; getDumpServlet() {<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    return RSDumpServlet.class;<a name="line.742"></a>
+<span class="sourceLineNo">736</span>  protected RSRpcServices createRpcServices() throws IOException {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>    return new RSRpcServices(this);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>  protected void configureInfoServer() {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    infoServer.addServlet("rs-status", "/rs-status", RSStatusServlet.class);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    infoServer.setAttribute(REGIONSERVER, this);<a name="line.742"></a>
 <span class="sourceLineNo">743</span>  }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>  @Override<a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    /*<a name="line.747"></a>
-<span class="sourceLineNo">748</span>     * No stacking of instances is allowed for a single executorService name<a name="line.748"></a>
-<span class="sourceLineNo">749</span>     */<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc =<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        instance.getDescriptorForType();<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      LOG.error("Coprocessor executorService " + serviceName<a name="line.754"></a>
-<span class="sourceLineNo">755</span>          + " already registered, rejecting request from " + instance);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      return false;<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    }<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    if (LOG.isDebugEnabled()) {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      LOG.debug("Registered regionserver coprocessor executorService: executorService=" + serviceName);<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    }<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    return true;<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span>  /**<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   * Create a 'smarter' Connection, one that is capable of by-passing RPC if the request is to<a name="line.767"></a>
-<span class="sourceLineNo">768</span>   * the local server; i.e. a short-circuit Connection. Safe to use going to local or remote<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * server. Create this instance in a method can be intercepted and mocked in tests.<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   * @throws IOException<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
-<span class="sourceLineNo">772</span>  @VisibleForTesting<a name="line.772"></a>
-<span class="sourceLineNo">773</span>  protected ClusterConnection createClusterConnection() throws IOException {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    Configuration conf = this.conf;<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    if (conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM) != null) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      // Use server ZK cluster for server-issued connections, so we clone<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      // the conf and unset the client ZK related properties<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      conf = new Configuration(this.conf);<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      conf.unset(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    }<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    // Create a cluster connection that when appropriate, can short-circuit and go directly to the<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    // local server if the request is to the local server bypassing RPC. Can be used for both local<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    // and remote invocations.<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    return ConnectionUtils.createShortCircuitConnection(conf, null, userProvider.getCurrent(),<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      serverName, rpcServices, rpcServices);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  }<a name="line.786"></a>
-<span class="sourceLineNo">787</span><a name="line.787"></a>
-<span class="sourceLineNo">788</span>  /**<a name="line.788"></a>
-<span class="sourceLineNo">789</span>   * Run test on configured codecs to make sure supporting libs are in place.<a name="line.789"></a>
-<span class="sourceLineNo">790</span>   * @param c<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   * @throws IOException<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  private static void checkCodecs(final Configuration c) throws IOException {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    // check to see if the codec list is available:<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    String [] codecs = c.getStrings("hbase.regionserver.codecs", (String[])null);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    if (codecs == null) return;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    for (String codec : codecs) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      if (!CompressionTest.testCompression(codec)) {<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        throw new IOException("Compression codec " + codec +<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          " not supported, aborting RS construction");<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      }<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  public String getClusterId() {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    return this.clusterId;<a name="line.806"></a>
+<span class="sourceLineNo">745</span>  protected Class&lt;? extends HttpServlet&gt; getDumpServlet() {<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    return RSDumpServlet.class;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>  @Override<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    /*<a name="line.751"></a>
+<span class="sourceLineNo">752</span>     * No stacking of instances is allowed for a single executorService name<a name="line.752"></a>
+<span class="sourceLineNo">753</span>     */<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc =<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        instance.getDescriptorForType();<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      LOG.error("Coprocessor executorService " + serviceName<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          + " already registered, rejecting request from " + instance);<a name="line.759"></a>
+<span class="sourceLineNo">760</span>      return false;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    if (LOG.isDebugEnabled()) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      LOG.debug("Registered regionserver coprocessor executorService: executorService=" + serviceName);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    return true;<a name="line.767"></a>
+<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>  /**<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   * Create a 'smarter' Connection, one that is capable of by-passing RPC if the request is to<a name="line.771"></a>
+<span class="sourceLineNo">772</span>   * the local server; i.e. a short-circuit Connection. Safe to use going to local or remote<a name="line.772"></a>
+<span class="sourceLineNo">773</span>   * server. Create this instance in a method can be intercepted and mocked in tests.<a name="line.773"></a>
+<span class="sourceLineNo">774</span>   * @throws IOException<a name="line.774"></a>
+<span class="sourceLineNo">775</span>   */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  @VisibleForTesting<a name="line.776"></a>
+<span class="sourceLineNo">777</span>  protected ClusterConnection createClusterConnection() throws IOException {<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    Configuration conf = this.conf;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    if (conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM) != null) {<a name="line.779"></a>
+<span class="sourceLineNo">780</span>      // Use server ZK cluster for server-issued connections, so we clone<a name="line.780"></a>
+<span class="sourceLineNo">781</span>      // the conf and unset the client ZK related properties<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      conf = new Configuration(this.conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      conf.unset(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    // Create a cluster connection that when appropriate, can short-circuit and go directly to the<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    // local server if the request is to the local server bypassing RPC. Can be used for both local<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    // and remote invocations.<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    return ConnectionUtils.createShortCircuitConnection(conf, null, userProvider.getCurrent(),<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      serverName, rpcServices, rpcServices);<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  /**<a name="line.792"></a>
+<span class="sourceLineNo">793</span>   * Run test on configured codecs to make sure supporting libs are in place.<a name="line.793"></a>
+<span class="sourceLineNo">794</span>   * @param c<a name="line.794"></a>
+<span class="sourceLineNo">795</span>   * @throws IOException<a name="line.795"></a>
+<span class="sourceLineNo">796</span>   */<a name="line.796"></a>
+<span class="sourceLineNo">797</span>  private static void checkCodecs(final Configuration c) throws IOException {<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    // check to see if the codec list is available:<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    String [] codecs = c.getStrings("hbase.regionserver.codecs", (String[])null);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    if (codecs == null) return;<a name="line.800"></a>
+<span class="sourceLineNo">801</span>    for (String codec : codecs) {<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      if (!CompressionTest.testCompression(codec)) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        throw new IOException("Compression codec " + codec +<a name="line.803"></a>
+<span class="sourceLineNo">804</span>          " not supported, aborting RS construction");<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
 <span class="sourceLineNo">807</span>  }<a name="line.807"></a>
 <span class="sourceLineNo">808</span><a name="line.808"></a>
-<span class="sourceLineNo">809</span>  /**<a name="line.809"></a>
-<span class="sourceLineNo">810</span>   * Setup our cluster connection if not already initialized.<a name="line.810"></a>
-<span class="sourceLineNo">811</span>   * @throws IOException<a name="line.811"></a>
-<span class="sourceLineNo">812</span>   */<a name="line.812"></a>
-<span class="sourceLineNo">813</span>  protected synchronized void setupClusterConnection() throws IOException {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    if (clusterConnection == null) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      clusterConnection = createClusterConnection();<a name="line.815"></a>
-<span class="sourceLineNo">816</span>      metaTableLocator = new MetaTableLocator();<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>  /**<a name="line.820"></a>
-<span class="sourceLineNo">821</span>   * All initialization needed before we go register with Master.&lt;br&gt;<a name="line.821"></a>
-<span class="sourceLineNo">822</span>   * Do bare minimum. Do bulk of initializations AFTER we've connected to the Master.&lt;br&gt;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>   * In here we just put up the RpcServer, setup Connection, and ZooKeeper.<a name="line.823"></a>
-<span class="sourceLineNo">824</span>   */<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  private void preRegistrationInitialization() {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    try {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      initializeZooKeeper();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      setupClusterConnection();<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      // Setup RPC client for master communication<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      this.rpcClient = RpcClientFactory.createClient(conf, clusterId, new InetSocketAddress(<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          this.rpcServices.isa.getAddress(), 0), clusterConnection.getConnectionMetrics());<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    } catch (Throwable t) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      // Call stop if error or process will stick around for ever since server<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // puts up non-daemon threads.<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      this.rpcServices.stop();<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      abort("Initialization of RS failed.  Hence aborting RS.", t);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>  /**<a name="line.840"></a>
-<span class="sourceLineNo">841</span>   * Bring up connection to zk ensemble and then wait until a master for this cluster and then after<a name="line.841"></a>
-<span class="sourceLineNo">842</span>   * that, wait until cluster 'up' flag has been set. This is the order in which master does things.<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * &lt;p&gt;<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * Finally open long-living server short-circuit connection.<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   */<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE",<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    justification="cluster Id znode read would give us correct response")<a name="line.847"></a>
-<span class="sourceLineNo">848</span>  private void initializeZooKeeper() throws IOException, InterruptedException {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    // Nothing to do in here if no Master in the mix.<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    if (this.masterless) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      return;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    }<a name="line.852"></a>
-<span class="sourceLineNo">853</span><a name="line.853"></a>
-<span class="sourceLineNo">854</span>    // Create the master address tracker, register with zk, and start it.  Then<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    // block until a master is available.  No point in starting up if no master<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    // running.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    blockAndCheckIfStopped(this.masterAddressTracker);<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    // Wait on cluster being up.  Master will set this flag up in zookeeper<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    // when ready.<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    blockAndCheckIfStopped(this.clusterStatusTracker);<a name="line.861"></a>
+<span class="sourceLineNo">809</span>  public String getClusterId() {<a name="line.809"></a>
+<span class="sourceLineNo">810</span>    return this.clusterId;<a name="line.810"></a>
+<span class="sourceLineNo">811</span>  }<a name="line.811"></a>
+<span class="sourceLineNo">812</span><a name="line.812"></a>
+<span class="sourceLineNo">813</span>  /**<a name="line.813"></a>
+<span class="sourceLineNo">814</span>   * Setup our cluster connection if not already initialized.<a name="line.814"></a>
+<span class="sourceLineNo">815</span>   * @throws IOException<a name="line.815"></a>
+<span class="sourceLineNo">816</span>   */<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  protected synchronized void setupClusterConnection() throws IOException {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    if (clusterConnection == null) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>      clusterConnection = createClusterConnection();<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      metaTableLocator = new MetaTableLocator();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    }<a name="line.821"></a>
+<span class="sourceLineNo">822</span>  }<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>  /**<a name="line.824"></a>
+<span class="sourceLineNo">825</span>   * All initialization needed before we go register with Master.&lt;br&gt;<a name="line.825"></a>
+<span class="sourceLineNo">826</span>   * Do bare minimum. Do bulk of initializations AFTER we've connected to the Master.&lt;br&gt;<a name="line.826"></a>
+<span class="sourceLineNo">827</span>   * In here we just put up the RpcServer, setup Connection, and ZooKeeper.<a name="line.827"></a>
+<span class="sourceLineNo">828</span>   */<a name="line.828"></a>
+<span class="sourceLineNo">829</span>  private void preRegistrationInitialization() {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    try {<a name="line.830"></a>
+<span class="sourceLineNo">831</span>      initializeZooKeeper();<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      setupClusterConnection();<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      // Setup RPC client for master communication<a name="line.833"></a>
+<span class="sourceLineNo">834</span>      this.rpcClient = RpcClientFactory.createClient(conf, clusterId, new InetSocketAddress(<a name="line.834"></a>
+<span class="sourceLineNo">835</span>          this.rpcServices.isa.getAddress(), 0), clusterConnection.getConnectionMetrics());<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    } catch (Throwable t) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>      // Call stop if error or process will stick around for ever since server<a name="line.837"></a>
+<span class="sourceLineNo">838</span>      // puts up non-daemon threads.<a name="line.838"></a>
+<span class="sourceLineNo">839</span>      this.rpcServices.stop();<a name="line.839"></a>
+<span class="sourceLineNo">840</span>      abort("Initialization of RS failed.  Hence aborting RS.", t);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
+<span class="sourceLineNo">842</span>  }<a name="line.842"></a>
+<span class="sourceLineNo">843</span><a name="line.843"></a>
+<span class="sourceLineNo">844</span>  /**<a name="line.844"></a>
+<span class="sourceLineNo">845</span>   * Bring up connection to zk ensemble and then wait until a master for this cluster and then after<a name="line.845"></a>
+<span class="sourceLineNo">846</span>   * that, wait until cluster 'up' flag has been set. This is the order in which master does things.<a name="line.846"></a>
+<span class="sourceLineNo">847</span>   * &lt;p&gt;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>   * Finally open long-living server short-circuit connection.<a name="line.848"></a>
+<span class="sourceLineNo">849</span>   */<a name="line.849"></a>
+<span class="sourceLineNo">850</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE",<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    justification="cluster Id znode read would give us correct response")<a name="line.851"></a>
+<span class="sourceLineNo">852</span>  private void initializeZooKeeper() throws IOException, InterruptedException {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    // Nothing to do in here if no Master in the mix.<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    if (this.masterless) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      return;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
+<span class="sourceLineNo">857</span><a name="line.857"></a>
+<span class="sourceLineNo">858</span>    // Create the master address tracker, register with zk, and start it.  Then<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    // block until a master is available.  No point in starting up if no master<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    // running.<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    blockAndCheckIfStopped(this.masterAddressTracker);<a name="line.861"></a>
 <span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>    // If we are HMaster then the cluster id should have already been set.<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    if (clusterId == null) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      // Retrieve clusterId<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      // Since cluster status is now up<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      // ID should have already been set by HMaster<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      try {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>        clusterId = ZKClusterId.readClusterIdZNode(this.zooKeeper);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        if (clusterId == null) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          this.abort("Cluster ID has not been set");<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        LOG.info("ClusterId : " + clusterId);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      } catch (KeeperException e) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>        this.abort("Failed to retrieve Cluster ID", e);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      }<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    }<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // In case colocated master, wait here till it's active.<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    // So backup masters won't start as regionservers.<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    // This is to avoid showing backup masters as regionservers<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    // in master web UI, or assigning any region to them.<a name="line.882"></a>
+<span class="sourceLineNo">863</span>    // Wait on cluster being up.  Master will set this flag up in zookeeper<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    // when ready.<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    blockAndCheckIfStopped(this.clusterStatusTracker);<a name="line.865"></a>
+<span class="sourceLineNo">866</span><a name="line.866"></a>
+<span class="sourceLineNo">867</span>    // If we are HMaster then the cluster id should have already been set.<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    if (clusterId == null) {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      // Retrieve clusterId<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      // Since cluster status is now up<a name="line.870"></a>
+<span class="sourceLineNo">871</span>      // ID should have already been set by HMaster<a name="line.871"></a>
+<span class="sourceLineNo">872</span>      try {<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        clusterId = ZKClusterId.readClusterIdZNode(this.zooKeeper);<a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (clusterId == null) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          this.abort("Cluster ID has not been set");<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        }<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        LOG.info("ClusterId : " + clusterId);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      } catch (KeeperException e) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        this.abort("Failed to retrieve Cluster ID", e);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
 <span class="sourceLineNo">883</span>    waitForMasterActive();<a name="line.883"></a>
 <span class="sourceLineNo">884</span>    if (isStopped() || isAborted()) {<a name="line.884"></a>
 <span class="sourceLineNo">885</span>      return; // No need for further initialization<a name="line.885"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/738e976e/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
index 34b8b52..3f9d8d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.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>