Index: hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRegionObserver.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRegionObserver.java (revision 1550673) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRegionObserver.java (working copy) @@ -81,6 +81,9 @@ public void postOpen(ObserverContext e) { } @Override + public void postReplay(ObserverContext e) { } + + @Override public void preClose(ObserverContext c, boolean abortRequested) throws IOException { } Index: hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionObserver.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionObserver.java (revision 1550673) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionObserver.java (working copy) @@ -86,6 +86,12 @@ void postOpen(final ObserverContext c); /** + * Called after the log replay on the region is over. + * @param c the environment provided by the region server + */ + void postReplay(final ObserverContext c); + + /** * Called before a memstore is flushed to disk and prior to creating the scanner to read from * the memstore. To override or modify how a memstore is flushed, * implementing classes can return a new scanner to provide the KeyValues to be Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (revision 1550673) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (working copy) @@ -852,7 +852,12 @@ * @param newState */ public void setRecovering(boolean newState) { + boolean wasRecovering = this.isRecovering; this.isRecovering = newState; + if (wasRecovering && !isRecovering) { + // Call only when log replay is over. + coprocessorHost.postReplay(); + } } /** Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java (revision 1550673) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java (working copy) @@ -316,6 +316,26 @@ } /** + * Invoked after log replay on region + */ + public void postReplay() { + ObserverContext ctx = null; + for (RegionEnvironment env: coprocessors) { + if (env.getInstance() instanceof RegionObserver) { + ctx = ObserverContext.createAndPrepare(env, ctx); + try { + ((RegionObserver) env.getInstance()).postReplay(ctx); + } catch (Throwable e) { + handleCoprocessorThrowableNoRethrow(env, e); + } + if (ctx.shouldComplete()) { + break; + } + } + } + } + + /** * Invoked before a region is closed * @param abortRequested true if the server is aborting */