http://git-wip-us.apache.org/repos/asf/hbase-site/blob/5a2158f2/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
----------------------------------------------------------------------
diff --git
a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
index 5d138ea..81d256e 100644
---
a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
+++
b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
@@ -2387,7 +2387,7 @@
<span class="sourceLineNo">2379</span> return true;<a
name="line.2379"></a>
<span class="sourceLineNo">2380</span> }<a name="line.2380"></a>
<span class="sourceLineNo">2381</span> long modifiedFlushCheckInterval =
flushCheckInterval;<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span> if (getRegionInfo().isSystemTable()
&&<a name="line.2382"></a>
+<span class="sourceLineNo">2382</span> if
(getRegionInfo().getTable().isSystemTable() &&<a name="line.2382"></a>
<span class="sourceLineNo">2383</span> getRegionInfo().getReplicaId()
== RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.2383"></a>
<span class="sourceLineNo">2384</span> modifiedFlushCheckInterval =
SYSTEM_CACHE_FLUSH_INTERVAL;<a name="line.2384"></a>
<span class="sourceLineNo">2385</span> }<a name="line.2385"></a>
@@ -7869,7 +7869,7 @@
<span class="sourceLineNo">7861</span> */<a name="line.7861"></a>
<span class="sourceLineNo">7862</span> public byte[] checkSplit() {<a
name="line.7862"></a>
<span class="sourceLineNo">7863</span> // Can't split META<a
name="line.7863"></a>
-<span class="sourceLineNo">7864</span> if
(this.getRegionInfo().isMetaTable() ||<a name="line.7864"></a>
+<span class="sourceLineNo">7864</span> if
(this.getRegionInfo().isMetaRegion() ||<a name="line.7864"></a>
<span class="sourceLineNo">7865</span>
TableName.NAMESPACE_TABLE_NAME.equals(this.getRegionInfo().getTable())) {<a
name="line.7865"></a>
<span class="sourceLineNo">7866</span> if (shouldForceSplit()) {<a
name="line.7866"></a>
<span class="sourceLineNo">7867</span> LOG.warn("Cannot split meta
region in HBase 0.20 and above");<a name="line.7867"></a>
@@ -7914,374 +7914,372 @@
<span class="sourceLineNo">7906</span> }<a name="line.7906"></a>
<span class="sourceLineNo">7907</span><a name="line.7907"></a>
<span class="sourceLineNo">7908</span> /** @return the coprocessor host */<a
name="line.7908"></a>
-<span class="sourceLineNo">7909</span> @Override<a name="line.7909"></a>
-<span class="sourceLineNo">7910</span> public RegionCoprocessorHost
getCoprocessorHost() {<a name="line.7910"></a>
-<span class="sourceLineNo">7911</span> return coprocessorHost;<a
name="line.7911"></a>
-<span class="sourceLineNo">7912</span> }<a name="line.7912"></a>
-<span class="sourceLineNo">7913</span><a name="line.7913"></a>
-<span class="sourceLineNo">7914</span> /** @param coprocessorHost the new
coprocessor host */<a name="line.7914"></a>
-<span class="sourceLineNo">7915</span> public void setCoprocessorHost(final
RegionCoprocessorHost coprocessorHost) {<a name="line.7915"></a>
-<span class="sourceLineNo">7916</span> this.coprocessorHost =
coprocessorHost;<a name="line.7916"></a>
-<span class="sourceLineNo">7917</span> }<a name="line.7917"></a>
-<span class="sourceLineNo">7918</span><a name="line.7918"></a>
-<span class="sourceLineNo">7919</span> @Override<a name="line.7919"></a>
-<span class="sourceLineNo">7920</span> public void startRegionOperation()
throws IOException {<a name="line.7920"></a>
-<span class="sourceLineNo">7921</span>
startRegionOperation(Operation.ANY);<a name="line.7921"></a>
-<span class="sourceLineNo">7922</span> }<a name="line.7922"></a>
-<span class="sourceLineNo">7923</span><a name="line.7923"></a>
-<span class="sourceLineNo">7924</span> @Override<a name="line.7924"></a>
-<span class="sourceLineNo">7925</span>
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SF_SWITCH_FALLTHROUGH",<a
name="line.7925"></a>
-<span class="sourceLineNo">7926</span> justification="Intentional")<a
name="line.7926"></a>
-<span class="sourceLineNo">7927</span> public void
startRegionOperation(Operation op) throws IOException {<a name="line.7927"></a>
-<span class="sourceLineNo">7928</span> switch (op) {<a name="line.7928"></a>
-<span class="sourceLineNo">7929</span> case GET: // read operations<a
name="line.7929"></a>
-<span class="sourceLineNo">7930</span> case SCAN:<a name="line.7930"></a>
-<span class="sourceLineNo">7931</span> checkReadsEnabled();<a
name="line.7931"></a>
-<span class="sourceLineNo">7932</span> case INCREMENT: // write
operations<a name="line.7932"></a>
-<span class="sourceLineNo">7933</span> case APPEND:<a
name="line.7933"></a>
-<span class="sourceLineNo">7934</span> case SPLIT_REGION:<a
name="line.7934"></a>
-<span class="sourceLineNo">7935</span> case MERGE_REGION:<a
name="line.7935"></a>
-<span class="sourceLineNo">7936</span> case PUT:<a name="line.7936"></a>
-<span class="sourceLineNo">7937</span> case DELETE:<a
name="line.7937"></a>
-<span class="sourceLineNo">7938</span> case BATCH_MUTATE:<a
name="line.7938"></a>
-<span class="sourceLineNo">7939</span> case COMPACT_REGION:<a
name="line.7939"></a>
-<span class="sourceLineNo">7940</span> case SNAPSHOT:<a
name="line.7940"></a>
-<span class="sourceLineNo">7941</span> // when a region is in
recovering state, no read, split, merge or snapshot is allowed<a
name="line.7941"></a>
-<span class="sourceLineNo">7942</span> if (isRecovering() &&
(this.disallowWritesInRecovering ||<a name="line.7942"></a>
-<span class="sourceLineNo">7943</span> (op != Operation.PUT
&& op != Operation.DELETE && op != Operation.BATCH_MUTATE)))
{<a name="line.7943"></a>
-<span class="sourceLineNo">7944</span> throw new
RegionInRecoveryException(getRegionInfo().getRegionNameAsString() +<a
name="line.7944"></a>
-<span class="sourceLineNo">7945</span> " is recovering; cannot take
reads");<a name="line.7945"></a>
-<span class="sourceLineNo">7946</span> }<a name="line.7946"></a>
-<span class="sourceLineNo">7947</span> break;<a name="line.7947"></a>
-<span class="sourceLineNo">7948</span> default:<a name="line.7948"></a>
-<span class="sourceLineNo">7949</span> break;<a name="line.7949"></a>
-<span class="sourceLineNo">7950</span> }<a name="line.7950"></a>
-<span class="sourceLineNo">7951</span> if (op == Operation.MERGE_REGION ||
op == Operation.SPLIT_REGION<a name="line.7951"></a>
-<span class="sourceLineNo">7952</span> || op ==
Operation.COMPACT_REGION) {<a name="line.7952"></a>
-<span class="sourceLineNo">7953</span> // split, merge or compact region
doesn't need to check the closing/closed state or lock the<a
name="line.7953"></a>
-<span class="sourceLineNo">7954</span> // region<a name="line.7954"></a>
-<span class="sourceLineNo">7955</span> return;<a name="line.7955"></a>
-<span class="sourceLineNo">7956</span> }<a name="line.7956"></a>
-<span class="sourceLineNo">7957</span> if (this.closing.get()) {<a
name="line.7957"></a>
-<span class="sourceLineNo">7958</span> throw new
NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is
closing");<a name="line.7958"></a>
-<span class="sourceLineNo">7959</span> }<a name="line.7959"></a>
-<span class="sourceLineNo">7960</span> lock(lock.readLock());<a
name="line.7960"></a>
-<span class="sourceLineNo">7961</span> if (this.closed.get()) {<a
name="line.7961"></a>
-<span class="sourceLineNo">7962</span> lock.readLock().unlock();<a
name="line.7962"></a>
-<span class="sourceLineNo">7963</span> throw new
NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is
closed");<a name="line.7963"></a>
-<span class="sourceLineNo">7964</span> }<a name="line.7964"></a>
-<span class="sourceLineNo">7965</span> // The unit for snapshot is a
region. So, all stores for this region must be<a name="line.7965"></a>
-<span class="sourceLineNo">7966</span> // prepared for snapshot operation
before proceeding.<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span> if (op == Operation.SNAPSHOT) {<a
name="line.7967"></a>
-<span class="sourceLineNo">7968</span>
stores.values().forEach(HStore::preSnapshotOperation);<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span> }<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span> try {<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span> if (coprocessorHost != null) {<a
name="line.7971"></a>
-<span class="sourceLineNo">7972</span>
coprocessorHost.postStartRegionOperation(op);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span> }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span> } catch (Exception e) {<a
name="line.7974"></a>
-<span class="sourceLineNo">7975</span> lock.readLock().unlock();<a
name="line.7975"></a>
-<span class="sourceLineNo">7976</span> throw new IOException(e);<a
name="line.7976"></a>
-<span class="sourceLineNo">7977</span> }<a name="line.7977"></a>
-<span class="sourceLineNo">7978</span> }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span><a name="line.7979"></a>
-<span class="sourceLineNo">7980</span> @Override<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span> public void closeRegionOperation()
throws IOException {<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>
closeRegionOperation(Operation.ANY);<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span> }<a name="line.7983"></a>
-<span class="sourceLineNo">7984</span><a name="line.7984"></a>
-<span class="sourceLineNo">7985</span> @Override<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span> public void
closeRegionOperation(Operation operation) throws IOException {<a
name="line.7986"></a>
-<span class="sourceLineNo">7987</span> if (operation == Operation.SNAPSHOT)
{<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>
stores.values().forEach(HStore::postSnapshotOperation);<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span> }<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span> lock.readLock().unlock();<a
name="line.7990"></a>
-<span class="sourceLineNo">7991</span> if (coprocessorHost != null) {<a
name="line.7991"></a>
-<span class="sourceLineNo">7992</span>
coprocessorHost.postCloseRegionOperation(operation);<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span> }<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span> }<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span><a name="line.7995"></a>
-<span class="sourceLineNo">7996</span> /**<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span> * This method needs to be called
before any public call that reads or<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span> * modifies stores in bulk. It has to
be called just before a try.<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span> * #closeBulkRegionOperation needs to
be called in the try's finally block<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span> * Acquires a writelock and checks if
the region is closing or closed.<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span> * @throws NotServingRegionException
when the region is closing or closed<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span> * @throws RegionTooBusyException if
failed to get the lock in time<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span> * @throws InterruptedIOException if
interrupted while waiting for a lock<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span> */<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span> private void
startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8005"></a>
-<span class="sourceLineNo">8006</span> throws NotServingRegionException,
RegionTooBusyException, InterruptedIOException {<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span> if (this.closing.get()) {<a
name="line.8007"></a>
-<span class="sourceLineNo">8008</span> throw new
NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is
closing");<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span> }<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span> if (writeLockNeeded)
lock(lock.writeLock());<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span> else lock(lock.readLock());<a
name="line.8011"></a>
-<span class="sourceLineNo">8012</span> if (this.closed.get()) {<a
name="line.8012"></a>
-<span class="sourceLineNo">8013</span> if (writeLockNeeded)
lock.writeLock().unlock();<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span> else lock.readLock().unlock();<a
name="line.8014"></a>
-<span class="sourceLineNo">8015</span> throw new
NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is
closed");<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span> }<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span> }<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span><a name="line.8018"></a>
-<span class="sourceLineNo">8019</span> /**<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span> * Closes the lock. This needs to be
called in the finally block corresponding<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span> * to the try block of
#startRegionOperation<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span> */<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span> private void
closeBulkRegionOperation(){<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span> if
(lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a
name="line.8024"></a>
-<span class="sourceLineNo">8025</span> else lock.readLock().unlock();<a
name="line.8025"></a>
-<span class="sourceLineNo">8026</span> }<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span><a name="line.8027"></a>
-<span class="sourceLineNo">8028</span> /**<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span> * Update LongAdders for number of
puts without wal and the size of possible data loss.<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span> * These information are exposed by
the region server metrics.<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span> */<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span> private void
recordMutationWithoutWal(final Map<byte [], List<Cell>> familyMap)
{<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>
numMutationsWithoutWAL.increment();<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span> if (numMutationsWithoutWAL.sum()
<= 1) {<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span> LOG.info("writing data to region "
+ this +<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span> " with WAL disabled. Data
may be lost in the event of a crash.");<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span> }<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span><a name="line.8038"></a>
-<span class="sourceLineNo">8039</span> long mutationSize = 0;<a
name="line.8039"></a>
-<span class="sourceLineNo">8040</span> for (List<Cell> cells:
familyMap.values()) {<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span> assert cells instanceof
RandomAccess;<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span> int listSize = cells.size();<a
name="line.8042"></a>
-<span class="sourceLineNo">8043</span> for (int i=0; i < listSize;
i++) {<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span> Cell cell = cells.get(i);<a
name="line.8044"></a>
-<span class="sourceLineNo">8045</span> mutationSize +=
KeyValueUtil.length(cell);<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span> }<a name="line.8046"></a>
-<span class="sourceLineNo">8047</span> }<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span><a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>
dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span> }<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span><a name="line.8051"></a>
-<span class="sourceLineNo">8052</span> private void lock(final Lock lock)<a
name="line.8052"></a>
-<span class="sourceLineNo">8053</span> throws RegionTooBusyException,
InterruptedIOException {<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span> lock(lock, 1);<a
name="line.8054"></a>
-<span class="sourceLineNo">8055</span> }<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span><a name="line.8056"></a>
-<span class="sourceLineNo">8057</span> /**<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span> * Try to acquire a lock. Throw
RegionTooBusyException<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span> * if failed to get the lock in time.
Throw InterruptedIOException<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span> * if interrupted while waiting for
the lock.<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span> */<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span> private void lock(final Lock lock,
final int multiplier)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span> throws RegionTooBusyException,
InterruptedIOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span> try {<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span> final long waitTime =
Math.min(maxBusyWaitDuration,<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span> busyWaitDuration *
Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span> if (!lock.tryLock(waitTime,
TimeUnit.MILLISECONDS)) {<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span> throw new
RegionTooBusyException(<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span> "failed to get a lock in " +
waitTime + " ms. " +<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span> "regionName=" +
(this.getRegionInfo() == null ? "unknown" :<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>
this.getRegionInfo().getRegionNameAsString()) +<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span> ", server=" +
(this.getRegionServerServices() == null ? "unknown" :<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>
this.getRegionServerServices().getServerName()));<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span> }<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span> } catch (InterruptedException ie)
{<a name="line.8075"></a>
-<span class="sourceLineNo">8076</span> LOG.info("Interrupted while
waiting for a lock");<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span> InterruptedIOException iie = new
InterruptedIOException();<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span> iie.initCause(ie);<a
name="line.8078"></a>
-<span class="sourceLineNo">8079</span> throw iie;<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span> }<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span> }<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span><a name="line.8082"></a>
-<span class="sourceLineNo">8083</span> /**<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span> * Calls sync with the given
transaction ID<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span> * @param txid should sync up to which
transaction<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span> * @throws IOException If anything
goes wrong with DFS<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span> */<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span> private void sync(long txid,
Durability durability) throws IOException {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span> if
(this.getRegionInfo().isMetaRegion()) {<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span> this.wal.sync(txid);<a
name="line.8090"></a>
-<span class="sourceLineNo">8091</span> } else {<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span> switch(durability) {<a
name="line.8092"></a>
-<span class="sourceLineNo">8093</span> case USE_DEFAULT:<a
name="line.8093"></a>
-<span class="sourceLineNo">8094</span> // do what table defaults to<a
name="line.8094"></a>
-<span class="sourceLineNo">8095</span> if (shouldSyncWAL()) {<a
name="line.8095"></a>
-<span class="sourceLineNo">8096</span> this.wal.sync(txid);<a
name="line.8096"></a>
-<span class="sourceLineNo">8097</span> }<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span> break;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span> case SKIP_WAL:<a
name="line.8099"></a>
-<span class="sourceLineNo">8100</span> // nothing do to<a
name="line.8100"></a>
-<span class="sourceLineNo">8101</span> break;<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span> case ASYNC_WAL:<a
name="line.8102"></a>
-<span class="sourceLineNo">8103</span> // nothing do to<a
name="line.8103"></a>
-<span class="sourceLineNo">8104</span> break;<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span> case SYNC_WAL:<a
name="line.8105"></a>
-<span class="sourceLineNo">8106</span> case FSYNC_WAL:<a
name="line.8106"></a>
-<span class="sourceLineNo">8107</span> // sync the WAL edit (SYNC and
FSYNC treated the same for now)<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span> this.wal.sync(txid);<a
name="line.8108"></a>
-<span class="sourceLineNo">8109</span> break;<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span> default:<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span> throw new
RuntimeException("Unknown durability " + durability);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span> }<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span> }<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span> }<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span><a name="line.8115"></a>
-<span class="sourceLineNo">8116</span> /**<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span> * Check whether we should sync the
wal from the table's durability settings<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span> */<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span> private boolean shouldSyncWAL() {<a
name="line.8119"></a>
-<span class="sourceLineNo">8120</span> return durability.ordinal() >
Durability.ASYNC_WAL.ordinal();<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span> }<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span><a name="line.8122"></a>
-<span class="sourceLineNo">8123</span> /**<a name="line.8123"></a>
-<span class="sourceLineNo">8124</span> * A mocked list implementation -
discards all updates.<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span> */<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span> private static final List<Cell>
MOCKED_LIST = new AbstractList<Cell>() {<a name="line.8126"></a>
-<span class="sourceLineNo">8127</span><a name="line.8127"></a>
-<span class="sourceLineNo">8128</span> @Override<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span> public void add(int index, Cell
element) {<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span> // do nothing<a
name="line.8130"></a>
-<span class="sourceLineNo">8131</span> }<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span><a name="line.8132"></a>
-<span class="sourceLineNo">8133</span> @Override<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span> public boolean addAll(int index,
Collection<? extends Cell> c) {<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span> return false; // this list is
never changed as a result of an update<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span> }<a name="line.8136"></a>
-<span class="sourceLineNo">8137</span><a name="line.8137"></a>
-<span class="sourceLineNo">8138</span> @Override<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span> public KeyValue get(int index) {<a
name="line.8139"></a>
-<span class="sourceLineNo">8140</span> throw new
UnsupportedOperationException();<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span> }<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span><a name="line.8142"></a>
-<span class="sourceLineNo">8143</span> @Override<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span> public int size() {<a
name="line.8144"></a>
-<span class="sourceLineNo">8145</span> return 0;<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span> }<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span> };<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span><a name="line.8148"></a>
-<span class="sourceLineNo">8149</span> /** @return the latest sequence number
that was read from storage when this region was opened */<a
name="line.8149"></a>
-<span class="sourceLineNo">8150</span> public long getOpenSeqNum() {<a
name="line.8150"></a>
-<span class="sourceLineNo">8151</span> return this.openSeqNum;<a
name="line.8151"></a>
-<span class="sourceLineNo">8152</span> }<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span><a name="line.8153"></a>
-<span class="sourceLineNo">8154</span> @Override<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span> public Map<byte[], Long>
getMaxStoreSeqId() {<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span> return this.maxSeqIdInStores;<a
name="line.8156"></a>
-<span class="sourceLineNo">8157</span> }<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span><a name="line.8158"></a>
-<span class="sourceLineNo">8159</span> public long
getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span> return
wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),
familyName);<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span> }<a name="line.8161"></a>
-<span class="sourceLineNo">8162</span><a name="line.8162"></a>
-<span class="sourceLineNo">8163</span> @Override<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span> public CompactionState
getCompactionState() {<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span> boolean hasMajor =
majorInProgress.get() > 0, hasMinor = minorInProgress.get() > 0;<a
name="line.8165"></a>
-<span class="sourceLineNo">8166</span> return (hasMajor ? (hasMinor ?
CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span> : (hasMinor ?
CompactionState.MINOR : CompactionState.NONE));<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span> }<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span><a name="line.8169"></a>
-<span class="sourceLineNo">8170</span> public void
reportCompactionRequestStart(boolean isMajor){<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span> (isMajor ? majorInProgress :
minorInProgress).incrementAndGet();<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span> }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span> public void
reportCompactionRequestEnd(boolean isMajor, int numFiles, long
filesSizeCompacted) {<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span> int newValue = (isMajor ?
majorInProgress : minorInProgress).decrementAndGet();<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span><a name="line.8176"></a>
-<span class="sourceLineNo">8177</span> // metrics<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span> compactionsFinished.increment();<a
name="line.8178"></a>
-<span class="sourceLineNo">8179</span>
compactionNumFilesCompacted.add(numFiles);<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>
compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span><a name="line.8181"></a>
-<span class="sourceLineNo">8182</span> assert newValue >= 0;<a
name="line.8182"></a>
-<span class="sourceLineNo">8183</span> }<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span><a name="line.8184"></a>
-<span class="sourceLineNo">8185</span> public void
reportCompactionRequestFailure() {<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span> compactionsFailed.increment();<a
name="line.8186"></a>
-<span class="sourceLineNo">8187</span> }<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span><a name="line.8188"></a>
-<span class="sourceLineNo">8189</span> public void
incrementCompactionsQueuedCount() {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span> compactionsQueued.increment();<a
name="line.8190"></a>
-<span class="sourceLineNo">8191</span> }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span><a name="line.8192"></a>
-<span class="sourceLineNo">8193</span> public void
decrementCompactionsQueuedCount() {<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span> compactionsQueued.decrement();<a
name="line.8194"></a>
-<span class="sourceLineNo">8195</span> }<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span><a name="line.8196"></a>
-<span class="sourceLineNo">8197</span> public void
incrementFlushesQueuedCount() {<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span> flushesQueued.increment();<a
name="line.8198"></a>
-<span class="sourceLineNo">8199</span> }<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span><a name="line.8200"></a>
-<span class="sourceLineNo">8201</span> @VisibleForTesting<a
name="line.8201"></a>
-<span class="sourceLineNo">8202</span> public long getReadPoint() {<a
name="line.8202"></a>
-<span class="sourceLineNo">8203</span> return
getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span> }<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span><a name="line.8205"></a>
-<span class="sourceLineNo">8206</span> /**<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span> * {@inheritDoc}<a
name="line.8207"></a>
-<span class="sourceLineNo">8208</span> */<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span> @Override<a name="line.8209"></a>
-<span class="sourceLineNo">8210</span> public void
onConfigurationChange(Configuration conf) {<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span> // Do nothing for now.<a
name="line.8211"></a>
-<span class="sourceLineNo">8212</span> }<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span><a name="line.8213"></a>
-<span class="sourceLineNo">8214</span> /**<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span> * {@inheritDoc}<a
name="line.8215"></a>
-<span class="sourceLineNo">8216</span> */<a name="line.8216"></a>
-<span class="sourceLineNo">8217</span> @Override<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span> public void
registerChildren(ConfigurationManager manager) {<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span> configurationManager =
Optional.of(manager);<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>
stores.values().forEach(manager::registerObserver);<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span> }<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span><a name="line.8222"></a>
-<span class="sourceLineNo">8223</span> /**<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span> * {@inheritDoc}<a
name="line.8224"></a>
-<span class="sourceLineNo">8225</span> */<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span> @Override<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span> public void
deregisterChildren(ConfigurationManager manager) {<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>
stores.values().forEach(configurationManager.get()::deregisterObserver);<a
name="line.8228"></a>
-<span class="sourceLineNo">8229</span> }<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span><a name="line.8230"></a>
-<span class="sourceLineNo">8231</span> @Override<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span> public CellComparator
getCellComparator() {<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span> return
this.getRegionInfo().isMetaRegion() ? CellComparator.META_COMPARATOR<a
name="line.8233"></a>
-<span class="sourceLineNo">8234</span> : CellComparator.COMPARATOR;<a
name="line.8234"></a>
-<span class="sourceLineNo">8235</span> }<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span><a name="line.8236"></a>
-<span class="sourceLineNo">8237</span> public long getMemStoreFlushSize() {<a
name="line.8237"></a>
-<span class="sourceLineNo">8238</span> return this.memstoreFlushSize;<a
name="line.8238"></a>
-<span class="sourceLineNo">8239</span> }<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span><a name="line.8240"></a>
-<span class="sourceLineNo">8241</span> //// method for debugging tests<a
name="line.8241"></a>
-<span class="sourceLineNo">8242</span> void throwException(String title,
String regionName) {<a name="line.8242"></a>
-<span class="sourceLineNo">8243</span> StringBuffer buf = new
StringBuffer();<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span> buf.append(title + ", ");<a
name="line.8244"></a>
-<span class="sourceLineNo">8245</span>
buf.append(getRegionInfo().toString());<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>
buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a
name="line.8246"></a>
-<span class="sourceLineNo">8247</span>
buf.append(getRegionInfo().isMetaTable() ? " meta table " : " ");<a
name="line.8247"></a>
-<span class="sourceLineNo">8248</span> buf.append("stores: ");<a
name="line.8248"></a>
-<span class="sourceLineNo">8249</span> for (HStore s : stores.values()) {<a
name="line.8249"></a>
-<span class="sourceLineNo">8250</span>
buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a
name="line.8250"></a>
-<span class="sourceLineNo">8251</span> buf.append(" size: ");<a
name="line.8251"></a>
-<span class="sourceLineNo">8252</span>
buf.append(s.getMemStoreSize().getDataSize());<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span> buf.append(" ");<a
name="line.8253"></a>
-<span class="sourceLineNo">8254</span> }<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span> buf.append("end-of-stores");<a
name="line.8255"></a>
-<span class="sourceLineNo">8256</span> buf.append(", memstore size ");<a
name="line.8256"></a>
-<span class="sourceLineNo">8257</span> buf.append(getMemStoreSize());<a
name="line.8257"></a>
-<span class="sourceLineNo">8258</span> if
(getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a
name="line.8258"></a>
-<span class="sourceLineNo">8259</span> throw new
RuntimeException(buf.toString());<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span> }<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span> }<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span><a name="line.8262"></a>
-<span class="sourceLineNo">8263</span> @Override<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span> public void requestCompaction(String
why, int priority, CompactionLifeCycleTracker tracker,<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span> User user) throws IOException {<a
name="line.8265"></a>
-<span class="sourceLineNo">8266</span> ((HRegionServer)
rsServices).compactSplitThread.requestCompaction(this, why, priority,
tracker,<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span> user);<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span> }<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span><a name="line.8269"></a>
-<span class="sourceLineNo">8270</span> @Override<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span> public void requestCompaction(byte[]
family, String why, int priority,<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span> CompactionLifeCycleTracker
tracker, User user) throws IOException {<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span> ((HRegionServer)
rsServices).compactSplitThread.requestCompaction(this,<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>
Preconditions.checkNotNull(stores.get(family)), why, priority, tracker,
user);<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span> }<a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>}<a name="line.8276"></a>
+<span class="sourceLineNo">7909</span> public RegionCoprocessorHost
getCoprocessorHost() {<a name="line.7909"></a>
+<span class="sourceLineNo">7910</span> return coprocessorHost;<a
name="line.7910"></a>
+<span class="sourceLineNo">7911</span> }<a name="line.7911"></a>
+<span class="sourceLineNo">7912</span><a name="line.7912"></a>
+<span class="sourceLineNo">7913</span> /** @param coprocessorHost the new
coprocessor host */<a name="line.7913"></a>
+<span class="sourceLineNo">7914</span> public void setCoprocessorHost(final
RegionCoprocessorHost coprocessorHost) {<a name="line.7914"></a>
+<span class="sourceLineNo">7915</span> this.coprocessorHost =
coprocessorHost;<a name="line.7915"></a>
+<span class="sourceLineNo">7916</span> }<a name="line.7916"></a>
+<span class="sourceLineNo">7917</span><a name="line.7917"></a>
+<span class="sourceLineNo">7918</span> @Override<a name="line.7918"></a>
+<span class="sourceLineNo">7919</span> public void startRegionOperation()
throws IOException {<a name="line.7919"></a>
+<span class="sourceLineNo">7920</span>
startRegionOperation(Operation.ANY);<a name="line.7920"></a>
+<span class="sourceLineNo">7921</span> }<a name="line.7921"></a>
+<span class="sourceLineNo">7922</span><a name="line.7922"></a>
+<span class="sourceLineNo">7923</span> @Override<a name="line.7923"></a>
+<span class="sourceLineNo">7924</span>
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SF_SWITCH_FALLTHROUGH",<a
name="line.7924"></a>
+<span class="sourceLineNo">7925</span> justification="Intentional")<a
name="line.7925"></a>
+<span class="sourceLineNo">7926</span> public void
startRegionOperation(Operation op) throws IOException {<a name="line.7926"></a>
+<span class="sourceLineNo">7927</span> switch (op) {<a name="line.7927"></a>
+<span class="sourceLineNo">7928</span> case GET: // read operations<a
name="line.7928"></a>
+<span class="sourceLineNo">7929</span> case SCAN:<a name="line.7929"></a>
+<span class="sourceLineNo">7930</span> checkReadsEnabled();<a
name="line.7930"></a>
+<span class="sourceLineNo">7931</span> case INCREMENT: // write
operations<a name="line.7931"></a>
+<span class="sourceLineNo">7932</span> case APPEND:<a
name="line.7932"></a>
+<span class="sourceLineNo">7933</span> case SPLIT_REGION:<a
name="line.7933"></a>
+<span class="sourceLineNo">7934</span> case MERGE_REGION:<a
name="line.7934"></a>
+<span class="sourceLineNo">7935</span> case PUT:<a name="line.7935"></a>
+<span class="sourceLineNo">7936</span> case DELETE:<a
name="line.7936"></a>
+<span class="sourceLineNo">7937</span> case BATCH_MUTATE:<a
name="line.7937"></a>
+<span class="sourceLineNo">7938</span> case COMPACT_REGION:<a
name="line.7938"></a>
+<span class="sourceLineNo">7939</span> case SNAPSHOT:<a
name="line.7939"></a>
+<span class="sourceLineNo">7940</span> // when a region is in
recovering state, no read, split, merge or snapshot is allowed<a
name="line.7940"></a>
+<span class="sourceLineNo">7941</span> if (isRecovering() &&
(this.disallowWritesInRecovering ||<a name="line.7941"></a>
+<span class="sourceLineNo">7942</span> (op != Operation.PUT
&& op != Operation.DELETE && op != Operation.BATCH_MUTATE)))
{<a name="line.7942"></a>
+<span class="sourceLineNo">7943</span> throw new
RegionInRecoveryException(getRegionInfo().getRegionNameAsString() +<a
name="line.7943"></a>
+<span class="sourceLineNo">7944</span> " is recovering; cannot take
reads");<a name="line.7944"></a>
+<span class="sourceLineNo">7945</span> }<a name="line.7945"></a>
+<span class="sourceLineNo">7946</span> break;<a name="line.7946"></a>
+<span class="sourceLineNo">7947</span> default:<a name="line.7947"></a>
+<span class="sourceLineNo">7948</span> break;<a name="line.7948"></a>
+<span class="sourceLineNo">7949</span> }<a name="line.7949"></a>
+<span class="sourceLineNo">7950</span> if (op == Operation.MERGE_REGION ||
op == Operation.SPLIT_REGION<a name="line.7950"></a>
+<span class="sourceLineNo">7951</span> || op ==
Operation.COMPACT_REGION) {<a name="line.7951"></a>
+<span class="sourceLineNo">7952</span> // split, merge or compact region
doesn't need to check the closing/closed state or lock the<a
name="line.7952"></a>
+<span class="sourceLineNo">7953</span> // region<a name="line.7953"></a>
+<span class="sourceLineNo">7954</span> return;<a name="line.7954"></a>
+<span class="sourceLineNo">7955</span> }<a name="line.7955"></a>
+<span class="sourceLineNo">7956</span> if (this.closing.get()) {<a
name="line.7956"></a>
+<span class="sourceLineNo">7957</span> throw new
NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is
closing");<a name="line.7957"></a>
+<span class="sourceLineNo">7958</span> }<a name="line.7958"></a>
+<span class="sourceLineNo">7959</span> lock(lock.readLock());<a
name="line.7959"></a>
+<span class="sourceLineNo">7960</span> if (this.closed.get()) {<a
name="line.7960"></a>
+<span class="sourceLineNo">7961</span> lock.readLock().unlock();<a
name="line.7961"></a>
+<span class="sourceLineNo">7962</span> throw new
NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is
closed");<a name="line.7962"></a>
+<span class="sourceLineNo">7963</span> }<a name="line.7963"></a>
+<span class="sourceLineNo">7964</span> // The unit for snapshot is a
region. So, all stores for this region must be<a name="line.7964"></a>
+<span class="sourceLineNo">7965</span> // prepared for snapshot operation
before proceeding.<a name="line.7965"></a>
+<span class="sourceLineNo">7966</span> if (op == Operation.SNAPSHOT) {<a
name="line.7966"></a>
+<span class="sourceLineNo">7967</span>
stores.values().forEach(HStore::preSnapshotOperation);<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span> }<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span> try {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span> if (coprocessorHost != null) {<a
name="line.7970"></a>
+<span class="sourceLineNo">7971</span>
coprocessorHost.postStartRegionOperation(op);<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span> }<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span> } catch (Exception e) {<a
name="line.7973"></a>
+<span class="sourceLineNo">7974</span> lock.readLock().unlock();<a
name="line.7974"></a>
+<span class="sourceLineNo">7975</span> throw new IOException(e);<a
name="line.7975"></a>
+<span class="sourceLineNo">7976</span> }<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span> }<a name="line.7977"></a>
+<span class="sourceLineNo">7978</span><a name="line.7978"></a>
+<span class="sourceLineNo">7979</span> @Override<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span> public void closeRegionOperation()
throws IOException {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>
closeRegionOperation(Operation.ANY);<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span> }<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span><a name="line.7983"></a>
+<span class="sourceLineNo">7984</span> @Override<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span> public void
closeRegionOperation(Operation operation) throws IOException {<a
name="line.7985"></a>
+<span class="sourceLineNo">7986</span> if (operation == Operation.SNAPSHOT)
{<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>
stores.values().forEach(HStore::postSnapshotOperation);<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span> }<a name="line.7988"></a>
+<span class="sourceLineNo">7989</span> lock.readLock().unlock();<a
name="line.7989"></a>
+<span class="sourceLineNo">7990</span> if (coprocessorHost != null) {<a
name="line.7990"></a>
+<span class="sourceLineNo">7991</span>
coprocessorHost.postCloseRegionOperation(operation);<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span> }<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span> }<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span><a name="line.7994"></a>
+<span class="sourceLineNo">7995</span> /**<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span> * This method needs to be called
before any public call that reads or<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span> * modifies stores in bulk. It has to
be called just before a try.<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span> * #closeBulkRegionOperation needs to
be called in the try's finally block<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span> * Acquires a writelock and checks if
the region is closing or closed.<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span> * @throws NotServingRegionException
when the region is closing or closed<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span> * @throws RegionTooBusyException if
failed to get the lock in time<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span> * @throws InterruptedIOException if
interrupted while waiting for a lock<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span> */<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span> private void
startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span> throws NotServingRegionException,
RegionTooBusyException, InterruptedIOException {<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span> if (this.closing.get()) {<a
name="line.8006"></a>
+<span class="sourceLineNo">8007</span> throw new
NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is
closing");<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span> }<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span> if (writeLockNeeded)
lock(lock.writeLock());<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span> else lock(lock.readLock());<a
name="line.8010"></a>
+<span class="sourceLineNo">8011</span> if (this.closed.get()) {<a
name="line.8011"></a>
+<span class="sourceLineNo">8012</span> if (writeLockNeeded)
lock.writeLock().unlock();<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span> else lock.readLock().unlock();<a
name="line.8013"></a>
+<span class="sourceLineNo">8014</span> throw new
NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is
closed");<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span> }<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span> }<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span><a name="line.8017"></a>
+<span class="sourceLineNo">8018</span> /**<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span> * Closes the lock. This needs to be
called in the finally block corresponding<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span> * to the try block of
#startRegionOperation<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span> */<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span> private void
closeBulkRegionOperation(){<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span> if
(lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a
name="line.8023"></a>
+<span class="sourceLineNo">8024</span> else lock.readLock().unlock();<a
name="line.8024"></a>
+<span class="sourceLineNo">8025</span> }<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span><a name="line.8026"></a>
+<span class="sourceLineNo">8027</span> /**<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span> * Update LongAdders for number of
puts without wal and the size of possible data loss.<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span> * These information are exposed by
the region server metrics.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span> */<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span> private void
recordMutationWithoutWal(final Map<byte [], List<Cell>> familyMap)
{<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>
numMutationsWithoutWAL.increment();<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span> if (numMutationsWithoutWAL.sum()
<= 1) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span> LOG.info("writing data to region "
+ this +<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span> " with WAL disabled. Data
may be lost in the event of a crash.");<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span> }<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span><a name="line.8037"></a>
+<span class="sourceLineNo">8038</span> long mutationSize = 0;<a
name="line.8038"></a>
+<span class="sourceLineNo">8039</span> for (List<Cell> cells:
familyMap.values()) {<a name="line.8039"></a>
+<span class="sourceLineNo">8040</span> assert cells instanceof
RandomAccess;<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span> int listSize = cells.size();<a
name="line.8041"></a>
+<span class="sourceLineNo">8042</span> for (int i=0; i < listSize;
i++) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span> Cell cell = cells.get(i);<a
name="line.8043"></a>
+<span class="sourceLineNo">8044</span> mutationSize +=
KeyValueUtil.length(cell);<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span> }<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span> }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span><a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>
dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span> }<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span><a name="line.8050"></a>
+<span class="sourceLineNo">8051</span> private void lock(final Lock lock)<a
name="line.8051"></a>
+<span class="sourceLineNo">8052</span> throws RegionTooBusyException,
InterruptedIOException {<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span> lock(lock, 1);<a
name="line.8053"></a>
+<span class="sourceLineNo">8054</span> }<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span><a name="line.8055"></a>
+<span class="sourceLineNo">8056</span> /**<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span> * Try to acquire a lock. Throw
RegionTooBusyException<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span> * if failed to get the lock in time.
Throw InterruptedIOException<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span> * if interrupted while waiting for
the lock.<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span> */<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span> private void lock(final Lock lock,
final int multiplier)<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span> throws RegionTooBusyException,
InterruptedIOException {<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span> try {<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span> final long waitTime =
Math.min(maxBusyWaitDuration,<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span> busyWaitDuration *
Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span> if (!lock.tryLock(waitTime,
TimeUnit.MILLISECONDS)) {<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span> throw new
RegionTooBusyException(<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span> "failed to get a lock in " +
waitTime + " ms. " +<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span> "regionName=" +
(this.getRegionInfo() == null ? "unknown" :<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>
this.getRegionInfo().getRegionNameAsString()) +<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span> ", server=" +
(this.getRegionServerServices() == null ? "unknown" :<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>
this.getRegionServerServices().getServerName()));<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span> }<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span> } catch (InterruptedException ie)
{<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span> LOG.info("Interrupted while
waiting for a lock");<a name="line.8075"></a>
+<span class="sourceLineNo">8076</span> InterruptedIOException iie = new
InterruptedIOException();<a name="line.8076"></a>
+<span class="sourceLineNo">8077</span> iie.initCause(ie);<a
name="line.8077"></a>
+<span class="sourceLineNo">8078</span> throw iie;<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span> }<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span> }<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span><a name="line.8081"></a>
+<span class="sourceLineNo">8082</span> /**<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span> * Calls sync with the given
transaction ID<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span> * @param txid should sync up to which
transaction<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span> * @throws IOException If anything
goes wrong with DFS<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span> */<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span> private void sync(long txid,
Durability durability) throws IOException {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span> if
(this.getRegionInfo().isMetaRegion()) {<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span> this.wal.sync(txid);<a
name="line.8089"></a>
+<span class="sourceLineNo">8090</span> } else {<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span> switch(durability) {<a
name="line.8091"></a>
+<span class="sourceLineNo">8092</span> case USE_DEFAULT:<a
name="line.8092"></a>
+<span class="sourceLineNo">8093</span> // do what table defaults to<a
name="line.8093"></a>
+<span class="sourceLineNo">8094</span> if (shouldSyncWAL()) {<a
name="line.8094"></a>
+<span class="sourceLineNo">8095</span> this.wal.sync(txid);<a
name="line.8095"></a>
+<span class="sourceLineNo">8096</span> }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span> break;<a name="line.8097"></a>
+<span class="sourceLineNo">8098</span> case SKIP_WAL:<a
name="line.8098"></a>
+<span class="sourceLineNo">8099</span> // nothing do to<a
name="line.8099"></a>
+<span class="sourceLineNo">8100</span> break;<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span> case ASYNC_WAL:<a
name="line.8101"></a>
+<span class="sourceLineNo">8102</span> // nothing do to<a
name="line.8102"></a>
+<span class="sourceLineNo">8103</span> break;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span> case SYNC_WAL:<a
name="line.8104"></a>
+<span class="sourceLineNo">8105</span> case FSYNC_WAL:<a
name="line.8105"></a>
+<span class="sourceLineNo">8106</span> // sync the WAL edit (SYNC and
FSYNC treated the same for now)<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span> this.wal.sync(txid);<a
name="line.8107"></a>
+<span class="sourceLineNo">8108</span> break;<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span> default:<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span> throw new
RuntimeException("Unknown durability " + durability);<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span> }<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span> }<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span> }<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span><a name="line.8114"></a>
+<span class="sourceLineNo">8115</span> /**<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span> * Check whether we should sync the
wal from the table's durability settings<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span> */<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span> private boolean shouldSyncWAL() {<a
name="line.8118"></a>
+<span class="sourceLineNo">8119</span> return durability.ordinal() >
Durability.ASYNC_WAL.ordinal();<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span> }<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span><a name="line.8121"></a>
+<span class="sourceLineNo">8122</span> /**<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span> * A mocked list implementation -
discards all updates.<a name="line.8123"></a>
+<span class="sourceLineNo">8124</span> */<a name="line.8124"></a>
+<span class="sourceLineNo">8125</span> private static final List<Cell>
MOCKED_LIST = new AbstractList<Cell>() {<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span><a name="line.8126"></a>
+<span class="sourceLineNo">8127</span> @Override<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span> public void add(int index, Cell
element) {<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span> // do nothing<a
name="line.8129"></a>
+<span class="sourceLineNo">8130</span> }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span> @Override<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span> public boolean addAll(int index,
Collection<? extends Cell> c) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span> return false; // this list is
never changed as a result of an update<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span> }<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span><a name="line.8136"></a>
+<span class="sourceLineNo">8137</span> @Override<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span> public KeyValue get(int index) {<a
name="line.8138"></a>
+<span class="sourceLineNo">8139</span> throw new
UnsupportedOperationException();<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span> }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span> @Override<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span> public int size() {<a
name="line.8143"></a>
+<span class="sourceLineNo">8144</span> return 0;<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span> }<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span> };<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span><a name="line.8147"></a>
+<span class="sourceLineNo">8148</span> /** @return the latest sequence number
that was read from storage when this region was opened */<a
name="line.8148"></a>
+<span class="sourceLineNo">8149</span> public long getOpenSeqNum() {<a
name="line.8149"></a>
+<span class="sourceLineNo">8150</span> return this.openSeqNum;<a
name="line.8150"></a>
+<span class="sourceLineNo">8151</span> }<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span><a name="line.8152"></a>
+<span class="sourceLineNo">8153</span> @Override<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span> public Map<byte[], Long>
getMaxStoreSeqId() {<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span> return this.maxSeqIdInStores;<a
name="line.8155"></a>
+<span class="sourceLineNo">8156</span> }<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span><a name="line.8157"></a>
+<span class="sourceLineNo">8158</span> public long
getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span> return
wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(),
familyName);<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span> }<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span><a name="line.8161"></a>
+<span class="sourceLineNo">8162</span> @Override<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span> public CompactionState
getCompactionState() {<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span> boolean hasMajor =
majorInProgress.get() > 0, hasMinor = minorInProgress.get() > 0;<a
name="line.8164"></a>
+<span class="sourceLineNo">8165</span> return (hasMajor ? (hasMinor ?
CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span> : (hasMinor ?
CompactionState.MINOR : CompactionState.NONE));<a name="line.8166"></a>
+<span class="sourceLineNo">8167</span> }<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span><a name="line.8168"></a>
+<span class="sourceLineNo">8169</span> public void
reportCompactionRequestStart(boolean isMajor){<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span> (isMajor ? majorInProgress :
minorInProgress).incrementAndGet();<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span> }<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span><a name="line.8172"></a>
+<span class="sourceLineNo">8173</span> public void
reportCompactionRequestEnd(boolean isMajor, int numFiles, long
filesSizeCompacted) {<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span> int newValue = (isMajor ?
majorInProgress : minorInProgress).decrementAndGet();<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span><a name="line.8175"></a>
+<span class="sourceLineNo">8176</span> // metrics<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span> compactionsFinished.increment();<a
name="line.8177"></a>
+<span class="sourceLineNo">8178</span>
compactionNumFilesCompacted.add(numFiles);<a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>
compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span><a name="line.8180"></a>
+<span class="sourceLineNo">8181</span> assert newValue >= 0;<a
name="line.8181"></a>
+<span class="sourceLineNo">8182</span> }<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span><a name="line.8183"></a>
+<span class="sourceLineNo">8184</span> public void
reportCompactionRequestFailure() {<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span> compactionsFailed.increment();<a
name="line.8185"></a>
+<span class="sourceLineNo">8186</span> }<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span><a name="line.8187"></a>
+<span class="sourceLineNo">8188</span> public void
incrementCompactionsQueuedCount() {<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span> compactionsQueued.increment();<a
name="line.8189"></a>
+<span class="sourceLineNo">8190</span> }<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span><a name="line.8191"></a>
+<span class="sourceLineNo">8192</span> public void
decrementCompactionsQueuedCount() {<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span> compactionsQueued.decrement();<a
name="line.8193"></a>
+<span class="sourceLineNo">8194</span> }<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span><a name="line.8195"></a>
+<span class="sourceLineNo">8196</span> public void
incrementFlushesQueuedCount() {<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span> flushesQueued.increment();<a
name="line.8197"></a>
+<span class="sourceLineNo">8198</span> }<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span><a name="line.8199"></a>
+<span class="sourceLineNo">8200</span> @VisibleForTesting<a
name="line.8200"></a>
+<span class="sourceLineNo">8201</span> public long getReadPoint() {<a
name="line.8201"></a>
+<span class="sourceLineNo">8202</span> return
getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span> }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span><a name="line.8204"></a>
+<span class="sourceLineNo">8205</span> /**<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span> * {@inheritDoc}<a
name="line.8206"></a>
+<span class="sourceLineNo">8207</span> */<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span> @Override<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span> public void
onConfigurationChange(Configuration conf) {<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span> // Do nothing for now.<a
name="line.8210"></a>
+<span class="sourceLineNo">8211</span> }<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span><a name="line.8212"></a>
+<span class="sourceLineNo">8213</span> /**<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span> * {@inheritDoc}<a
name="line.8214"></a>
+<span class="sourceLineNo">8215</span> */<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span> @Override<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span> public void
registerChildren(ConfigurationManager manager) {<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span> configurationManager =
Optional.of(manager);<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>
stores.values().forEach(manager::registerObserver);<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span> }<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span> /**<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span> * {@inheritDoc}<a
name="line.8223"></a>
+<span class="sourceLineNo">8224</span> */<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span> @Override<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span> public void
deregisterChildren(ConfigurationManager manager) {<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>
stores.values().forEach(configurationManager.get()::deregisterObserver);<a
name="line.8227"></a>
+<span class="sourceLineNo">8228</span> }<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span><a name="line.8229"></a>
+<span class="sourceLineNo">8230</span> @Override<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span> public CellComparator
getCellComparator() {<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span> return
this.getRegionInfo().isMetaRegion() ? CellComparator.META_COMPARATOR<a
name="line.8232"></a>
+<span class="sourceLineNo">8233</span> : CellComparator.COMPARATOR;<a
name="line.8233"></a>
+<span class="sourceLineNo">8234</span> }<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span><a name="line.8235"></a>
+<span class="sourceLineNo">8236</span> public long getMemStoreFlushSize() {<a
name="line.8236"></a>
+<span class="sourceLineNo">8237</span> return this.memstoreFlushSize;<a
name="line.8237"></a>
+<span class="sourceLineNo">8238</span> }<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span><a name="line.8239"></a>
+<span class="sourceLineNo">8240</span> //// method for debugging tests<a
name="line.8240"></a>
+<span class="sourceLineNo">8241</span> void throwException(String title,
String regionName) {<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span> StringBuffer buf = new
StringBuffer();<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span> buf.append(title + ", ");<a
name="line.8243"></a>
+<span class="sourceLineNo">8244</span>
buf.append(getRegionInfo().toString());<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>
buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a
name="line.8245"></a>
+<span class="sourceLineNo">8246</span> buf.append("stores: ");<a
name="line.8246"></a>
+<span class="sourceLineNo">8247</span> for (HStore s : stores.values()) {<a
name="line.8247"></a>
+<span class="sourceLineNo">8248</span>
buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a
name="line.8248"></a>
+<span class="sourceLineNo">8249</span> buf.append(" size: ");<a
name="line.8249"></a>
+<span class="sourceLineNo">8250</span>
buf.append(s.getMemStoreSize().getDataSize());<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span> buf.append(" ");<a
name="line.8251"></a>
+<span class="sourceLineNo">8252</span> }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span> buf.append("end-of-stores");<a
name="line.8253"></a>
+<span class="sourceLineNo">8254</span> buf.append(", memstore size ");<a
name="line.8254"></a>
+<span class="sourceLineNo">8255</span> buf.append(getMemStoreSize());<a
name="line.8255"></a>
+<span class="sourceLineNo">8256</span> if
(getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a
name="line.8256"></a>
+<span class="sourceLineNo">8257</span> throw new
RuntimeException(buf.toString());<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span> }<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span> }<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span><a name="line.8260"></a>
+<span class="sourceLineNo">8261</span> @Override<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span> public void requestCompaction(String
why, int priority, CompactionLifeCycleTracker tracker,<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span> User user) throws IOException {<a
name="line.8263"></a>
+<span class="sourceLineNo">8264</span> ((HRegionServer)
rsServices).compactSplitThread.requestCompaction(this, why, priority,
tracker,<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span> user);<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span> }<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span><a name="line.8267"></a>
+<span class="sourceLineNo">8268</span> @Override<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span> public void requestCompaction(byte[]
family, String why, int priority,<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span> CompactionLifeCycleTracker
tracker, User user) throws IOException {<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span> ((HRegionServer)
rsServices).compactSplitThread.requestCompaction(this,<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>
Preconditions.checkNotNull(stores.get(family)), why, priority, tracker,
user);<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span> }<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>}<a name="line.8274"></a>