Author: stack
Date: Fri Sep 23 22:09:01 2011
New Revision: 1175048

URL: http://svn.apache.org/viewvc?rev=1175048&view=rev
Log:
HBASE-4131 Make the Replication Service pluggable via a standard interface 
definition; BACKED IT OUT -- WAS CAUSING TestReplication failures

Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/HConstants.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationService.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationSinkService.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationSourceService.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java

Modified: hbase/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1175048&r1=1175047&r2=1175048&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Fri Sep 23 22:09:01 2011
@@ -3,8 +3,6 @@ Release 0.93.0 - Unreleased
   IMPROVEMENT
    HBASE-4132  Extend the WALActionsListener API to accomodate log archival
                (dhruba borthakur)
-   HBASE-4131  Make the Replication Service pluggable via a standard
-               interface definition (dhruba borthakur)
 
 Release 0.92.0 - Unreleased
   INCOMPATIBLE CHANGES

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/HConstants.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/HConstants.java?rev=1175048&r1=1175047&r2=1175048&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/HConstants.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/HConstants.java Fri Sep 
23 22:09:01 2011
@@ -473,17 +473,8 @@ public final class HConstants {
    */
   public static int DEFAULT_HBASE_RPC_TIMEOUT = 60000;
 
-  /*
-   * cluster replication constants.
-   */
   public static final String
       REPLICATION_ENABLE_KEY = "hbase.replication";
-  public static final String 
-      REPLICATION_SOURCE_SERVICE_CLASSNAME = 
"hbase.replication.source.service";
-  public static final String 
-      REPLICATION_SINK_SERVICE_CLASSNAME = "hbase.replication.sink.service";
-  public static final String REPLICATION_SERVICE_CLASSNAME_DEFAULT =
-    "org.apache.hadoop.hbase.replication.regionserver.Replication";
 
   /** HBCK special code name used as server name when manipulating ZK nodes */
   public static final String HBCK_CODE_NAME = "HBCKServerName";

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1175048&r1=1175047&r2=1175048&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
 Fri Sep 23 22:09:01 2011
@@ -54,7 +54,6 @@ import org.apache.hadoop.conf.Configurat
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Chore;
-import org.apache.hadoop.util.ReflectionUtils;
 import org.apache.hadoop.hbase.ClockOutOfSyncException;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
 import org.apache.hadoop.hbase.HBaseConfiguration;
@@ -285,8 +284,7 @@ public class HRegionServer implements HR
   private ExecutorService service;
 
   // Replication services. If no replication, this handler will be null.
-  private ReplicationSourceService replicationSourceHandler;
-  private ReplicationSinkService replicationSinkHandler;
+  private Replication replicationHandler;
 
   private final RegionServerAccounting regionServerAccounting;
 
@@ -1171,7 +1169,12 @@ public class HRegionServer implements HR
 
     // Instantiate replication manager if replication enabled.  Pass it the
     // log directories.
-    createNewReplicationInstance(conf, this, this.fs, logdir, oldLogDir);
+    try {
+      this.replicationHandler = Replication.isReplication(this.conf)?
+        new Replication(this, this.fs, logdir, oldLogDir): null;
+    } catch (KeeperException e) {
+      throw new IOException("Failed replication handler create", e);
+    }
     return instantiateHLog(logdir, oldLogDir);
   }
 
@@ -1198,10 +1201,9 @@ public class HRegionServer implements HR
     // Log roller.
     this.hlogRoller = new LogRoller(this, this);
     listeners.add(this.hlogRoller);
-    if (this.replicationSourceHandler != null &&
-        this.replicationSourceHandler.getWALActionsListener() != null) {
+    if (this.replicationHandler != null) {
       // Replication handler is an implementation of WALActionsListener.
-      listeners.add(this.replicationSourceHandler.getWALActionsListener());
+      listeners.add(this.replicationHandler);
     }
     return listeners;
   }
@@ -1349,13 +1351,8 @@ public class HRegionServer implements HR
     // that port is occupied. Adjust serverInfo if this is the case.
     this.webuiport = putUpWebUI();
 
-    if (this.replicationSourceHandler == this.replicationSinkHandler &&
-        this.replicationSourceHandler != null) {
-      this.replicationSourceHandler.startReplicationService();
-    } else if (this.replicationSourceHandler != null) {
-      this.replicationSourceHandler.startReplicationService();
-    } else if (this.replicationSinkHandler != null) {
-      this.replicationSinkHandler.startReplicationService();
+    if (this.replicationHandler != null) {
+      this.replicationHandler.startReplicationServices();
     }
 
     // Start Server.  This service is like leases in that it internally runs
@@ -1560,33 +1557,12 @@ public class HRegionServer implements HR
       this.compactSplitThread.join();
     }
     if (this.service != null) this.service.shutdown();
-    if (this.replicationSourceHandler != null &&
-        this.replicationSourceHandler == this.replicationSinkHandler) {
-      this.replicationSourceHandler.stopReplicationService();
-    } else if (this.replicationSourceHandler != null) {
-      this.replicationSourceHandler.stopReplicationService();
-    } else if (this.replicationSinkHandler != null) {
-      this.replicationSinkHandler.stopReplicationService();
+    if (this.replicationHandler != null) {
+      this.replicationHandler.join();
     }
   }
 
   /**
-   * @return Return the object that implements the replication
-   * source service.
-   */
-  ReplicationSourceService getReplicationSourceService() {
-    return replicationSourceHandler;
-  }
-
-  /**
-   * @return Return the object that implements the replication
-   * sink service.
-   */
-  ReplicationSinkService getReplicationSinkService() {
-    return replicationSinkHandler;
-  }
-
-  /**
    * Get the current master from ZooKeeper and open the RPC connection to it.
    *
    * Method will block until a master is available. You can break from this
@@ -3088,63 +3064,6 @@ public class HRegionServer implements HR
   //
 
   /**
-   * Load the replication service objects, if any
-   */
-  static private void createNewReplicationInstance(Configuration conf,
-    HRegionServer server, FileSystem fs, Path logDir, Path oldLogDir) throws 
IOException{
-
-    // If replication is not enabled, then return immediately.
-    if (!conf.getBoolean(HConstants.REPLICATION_ENABLE_KEY, false)) {
-      return;
-    }
-
-    // read in the name of the source replication class from the config file.
-    String sourceClassname = 
conf.get(HConstants.REPLICATION_SOURCE_SERVICE_CLASSNAME,
-                               
HConstants.REPLICATION_SERVICE_CLASSNAME_DEFAULT);
-    
-    // read in the name of the sink replication class from the config file.
-    String sinkClassname = 
conf.get(HConstants.REPLICATION_SINK_SERVICE_CLASSNAME,
-                             HConstants.REPLICATION_SERVICE_CLASSNAME_DEFAULT);
-
-    // If both the sink and the source class names are the same, then 
instantiate
-    // only one object.
-    if (sourceClassname.equals(sinkClassname)) {
-      server.replicationSourceHandler = (ReplicationSourceService)
-                                         
newReplicationInstance(sourceClassname,
-                                         conf, server, fs, logDir, oldLogDir);
-      server.replicationSinkHandler = (ReplicationSinkService)
-                                         server.replicationSinkHandler;
-    }
-    else {
-      server.replicationSourceHandler = (ReplicationSourceService)
-                                         
newReplicationInstance(sourceClassname,
-                                         conf, server, fs, logDir, oldLogDir);
-      server.replicationSinkHandler = (ReplicationSinkService)
-                                         newReplicationInstance(sinkClassname,
-                                         conf, server, fs, logDir, oldLogDir);
-    }
-  }
-
-  static private ReplicationService newReplicationInstance(String classname,
-    Configuration conf, HRegionServer server, FileSystem fs, Path logDir, 
-    Path oldLogDir) throws IOException{
-
-    Class<?> clazz = null;
-    try {
-      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-      clazz = Class.forName(classname, true, classLoader);
-    } catch (java.lang.ClassNotFoundException nfe) {
-      throw new IOException("Cound not find class for " + classname);
-    }
-
-    // create an instance of the replication object.
-    ReplicationService service = (ReplicationService)
-                              ReflectionUtils.newInstance(clazz, conf);
-    service.initialize(server, fs, logDir, oldLogDir);
-    return service;
-  }
-
-  /**
    * @param hrs
    * @return Thread the RegionServer is running in correctly named.
    * @throws IOException
@@ -3196,8 +3115,8 @@ public class HRegionServer implements HR
   public void replicateLogEntries(final HLog.Entry[] entries)
   throws IOException {
     checkOpen();
-    if (this.replicationSinkHandler == null) return;
-    this.replicationSinkHandler.replicateLogEntries(entries);
+    if (this.replicationHandler == null) return;
+    this.replicationHandler.replicateLogEntries(entries);
   }
 
   /**

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationService.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationService.java?rev=1175048&r1=1175047&r2=1175048&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationService.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationService.java
 Fri Sep 23 22:09:01 2011
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.hbase.regionserver;
-
-import java.io.IOException;
-
-import org.apache.hadoop.hbase.Server;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-
-/**
- * Gateway to Cluster Replication.  
- * Used by {@link org.apache.hadoop.hbase.regionserver.HRegionServer}.
- * One such application is a cross-datacenter
- * replication service that can keep two hbase clusters in sync.
- */
-public interface ReplicationService {
-
-  /**
-   * Initializes the replication service object.
-   * @throws IOException
-   */
-  public void initialize(Server rs, FileSystem fs, Path logdir,
-                         Path oldLogDir) throws IOException;
-
-  /**
-   * Start replication services.
-   * @throws IOException
-   */
-  public void startReplicationService() throws IOException;
-
-  /**
-   * Stops replication service.
-   */
-  public void stopReplicationService();
-}

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationSinkService.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationSinkService.java?rev=1175048&r1=1175047&r2=1175048&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationSinkService.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationSinkService.java
 Fri Sep 23 22:09:01 2011
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.hbase.regionserver;
-
-import java.io.IOException;
-
-import org.apache.hadoop.hbase.regionserver.wal.HLog;
-
-/**
- * A sink for a replication stream has to expose this service.
- * This service allows an application to hook into the
- * regionserver and behave as a replication sink.
- */
-public interface ReplicationSinkService extends ReplicationService {
-
- /**
-   * Carry on the list of log entries down to the sink
-   * @param entries list of entries to replicate
-   * @throws IOException
-   */
-  public void replicateLogEntries(HLog.Entry[] entries) throws IOException;
-}

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationSourceService.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationSourceService.java?rev=1175048&r1=1175047&r2=1175048&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationSourceService.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/ReplicationSourceService.java
 Fri Sep 23 22:09:01 2011
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.hbase.regionserver;
-
-import java.io.IOException;
-
-import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;
-
-/**
- * A source for a replication stream has to expose this service.
- * This service allows an application to hook into the
- * regionserver and watch for new transactions.
- */
-public interface ReplicationSourceService extends ReplicationService {
-
-  /**
-   * Returns a WALObserver for the service. This is needed to 
-   * observe log rolls and log archival events.
-   */
-  public WALActionsListener getWALActionsListener();
-}

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java?rev=1175048&r1=1175047&r2=1175048&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java
 Fri Sep 23 22:09:01 2011
@@ -31,8 +31,6 @@ import org.apache.hadoop.hbase.HRegionIn
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.Server;
-import org.apache.hadoop.hbase.regionserver.ReplicationSourceService;
-import org.apache.hadoop.hbase.regionserver.ReplicationSinkService;
 import org.apache.hadoop.hbase.regionserver.wal.HLog;
 import org.apache.hadoop.hbase.regionserver.wal.HLogKey;
 import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
@@ -49,16 +47,15 @@ import static org.apache.hadoop.hbase.HC
 /**
  * Gateway to Replication.  Used by {@link 
org.apache.hadoop.hbase.regionserver.HRegionServer}.
  */
-public class Replication implements WALActionsListener, 
-  ReplicationSourceService, ReplicationSinkService {
-  private boolean replication;
-  private ReplicationSourceManager replicationManager;
+public class Replication implements WALActionsListener {
+  private final boolean replication;
+  private final ReplicationSourceManager replicationManager;
   private final AtomicBoolean replicating = new AtomicBoolean(true);
-  private ReplicationZookeeper zkHelper;
-  private Configuration conf;
+  private final ReplicationZookeeper zkHelper;
+  private final Configuration conf;
   private ReplicationSink replicationSink;
   // Hosting server
-  private Server server;
+  private final Server server;
 
   /**
    * Instantiate the replication management (if rep is enabled).
@@ -67,29 +64,16 @@ public class Replication implements WALA
    * @param logDir
    * @param oldLogDir directory where logs are archived
    * @throws IOException
+   * @throws KeeperException 
    */
   public Replication(final Server server, final FileSystem fs,
-      final Path logDir, final Path oldLogDir) throws IOException{
-    initialize(server, fs, logDir, oldLogDir);
-  }
-
-  /**
-   * Empty constructor
-   */
-  public Replication() {
-  }
-
-  public void initialize(final Server server, final FileSystem fs,
-      final Path logDir, final Path oldLogDir) throws IOException {
+      final Path logDir, final Path oldLogDir)
+  throws IOException, KeeperException {
     this.server = server;
     this.conf = this.server.getConfiguration();
     this.replication = isReplication(this.conf);
     if (replication) {
-      try {
-        this.zkHelper = new ReplicationZookeeper(server, this.replicating);
-      } catch (KeeperException ke) {
-        throw new IOException("Failed replication handler create", ke);
-      }
+      this.zkHelper = new ReplicationZookeeper(server, this.replicating);
       this.replicationManager = new ReplicationSourceManager(zkHelper, conf,
           this.server, fs, this.replicating, logDir, oldLogDir) ;
     } else {
@@ -98,25 +82,12 @@ public class Replication implements WALA
     }
   }
 
-   /**
-    * @param c Configuration to look at
-    * @return True if replication is enabled.
-    */
-  public static boolean isReplication(final Configuration c) {
-    return c.getBoolean(REPLICATION_ENABLE_KEY, false);
-  }
-
-   /*
-    * Returns an object to listen to new hlog changes
-    **/
-  public WALActionsListener getWALActionsListener() {
-    return this;
-  }
   /**
-   * Stops replication service.
+   * @param c Configuration to look at
+   * @return True if replication is enabled.
    */
-  public void stopReplicationService() {
-    join();
+  public static boolean isReplication(final Configuration c) {
+    return c.getBoolean(REPLICATION_ENABLE_KEY, false);
   }
 
   /**
@@ -144,7 +115,7 @@ public class Replication implements WALA
    * it starts
    * @throws IOException
    */
-  public void startReplicationService() throws IOException {
+  public void startReplicationServices() throws IOException {
     if (this.replication) {
       this.replicationManager.init();
       this.replicationSink = new ReplicationSink(this.conf, this.server);


Reply via email to