You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ae...@apache.org on 2016/04/13 03:01:19 UTC
hadoop git commit: HDFS-10251. Ozone: Shutdown cleanly. Contributed
by Anu Engineer
Repository: hadoop
Updated Branches:
refs/heads/HDFS-7240 3f62ba558 -> 33b51da8c
HDFS-10251. Ozone: Shutdown cleanly. Contributed by Anu Engineer
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/33b51da8
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/33b51da8
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/33b51da8
Branch: refs/heads/HDFS-7240
Commit: 33b51da8c558f366e0bfa87087d158ee1dde2f60
Parents: 3f62ba5
Author: Anu Engineer <ae...@apache.org>
Authored: Tue Apr 12 18:00:24 2016 -0700
Committer: Anu Engineer <ae...@apache.org>
Committed: Tue Apr 12 18:00:24 2016 -0700
----------------------------------------------------------------------
.../container/common/helpers/KeyUtils.java | 24 +++++++++++
.../container/common/impl/ChunkManagerImpl.java | 11 +++++
.../common/impl/ContainerManagerImpl.java | 5 ++-
.../container/common/impl/KeyManagerImpl.java | 9 +++++
.../common/interfaces/ChunkManager.java | 5 +++
.../common/interfaces/ContainerManager.java | 2 +-
.../container/common/interfaces/KeyManager.java | 21 ++++++----
.../common/transport/server/XceiverServer.java | 2 +-
.../container/common/utils/ContainerCache.java | 16 --------
.../container/ozoneimpl/OzoneContainer.java | 42 +++++++++++++++++++-
10 files changed, 108 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hadoop/blob/33b51da8/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/helpers/KeyUtils.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/helpers/KeyUtils.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/helpers/KeyUtils.java
index b0db9a7..0ded9ec 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/helpers/KeyUtils.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/helpers/KeyUtils.java
@@ -19,8 +19,11 @@ package org.apache.hadoop.ozone.container.common.helpers;
import com.google.common.base.Preconditions;
import org.apache.hadoop.hdfs.ozone.protocol.proto.ContainerProtos;
+import org.apache.hadoop.ozone.container.common.impl.KeyManagerImpl;
import org.apache.hadoop.ozone.container.common.utils.ContainerCache;
import org.apache.hadoop.ozone.container.common.utils.LevelDBStore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
@@ -72,6 +75,27 @@ public final class KeyUtils {
}
/**
+ * Shutdown all DB Handles.
+ *
+ * @param cache - Cache for DB Handles.
+ * @throws IOException
+ */
+ @SuppressWarnings("unchecked")
+ public static void shutdownCache(ContainerCache cache) {
+ Logger log = LoggerFactory.getLogger(KeyManagerImpl.class);
+ LevelDBStore[] handles = new LevelDBStore[cache.values().size()];
+ cache.values().toArray(handles);
+ Preconditions.checkState(handles.length == cache.values().size());
+ for (LevelDBStore db : handles) {
+ try {
+ db.close();
+ } catch (IOException ex) {
+ log.error("error closing db. error {}", ex);
+ }
+ }
+ }
+
+ /**
* Returns successful keyResponse.
* @param msg - Request.
* @return Response.
http://git-wip-us.apache.org/repos/asf/hadoop/blob/33b51da8/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ChunkManagerImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ChunkManagerImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ChunkManagerImpl.java
index 090d659..c30fa8a 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ChunkManagerImpl.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ChunkManagerImpl.java
@@ -146,4 +146,15 @@ public class ChunkManagerImpl implements ChunkManager {
containerManager.readUnlock();
}
}
+
+ /**
+ * Shutdown the chunkManager.
+ *
+ * In the chunkManager we haven't acquired any resources, so nothing to do
+ * here. This call is made with containerManager Writelock held.
+ */
+ @Override
+ public void shutdown() {
+ Preconditions.checkState(this.containerManager.hasWriteLock());
+ }
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/33b51da8/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerManagerImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerManagerImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerManagerImpl.java
index 28bb663..cbed507 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerManagerImpl.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerManagerImpl.java
@@ -385,8 +385,9 @@ public class ContainerManagerImpl implements ContainerManager {
* @throws IOException
*/
@Override
- public void shutdown() throws IOException {
-
+ public void shutdown() {
+ Preconditions.checkState(this.hasWriteLock());
+ this.containerMap.clear();
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/33b51da8/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/KeyManagerImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/KeyManagerImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/KeyManagerImpl.java
index 2da65ca..a0f4526 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/KeyManagerImpl.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/impl/KeyManagerImpl.java
@@ -142,4 +142,13 @@ public class KeyManagerImpl implements KeyManager {
// TODO :
return null;
}
+
+ /**
+ * Shutdown keyManager.
+ */
+ @Override
+ public void shutdown() {
+ Preconditions.checkState(this.containerManager.hasWriteLock());
+ KeyUtils.shutdownCache(containerCache);
+ }
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/33b51da8/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ChunkManager.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ChunkManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ChunkManager.java
index 19af452..5931c96 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ChunkManager.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ChunkManager.java
@@ -65,4 +65,9 @@ public interface ChunkManager {
// TODO : Support list operations.
+ /**
+ * Shutdown the chunkManager.
+ */
+ void shutdown();
+
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/33b51da8/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java
index 65a974c..d706c96 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java
@@ -94,7 +94,7 @@ public interface ContainerManager extends RwLock {
*
* @throws IOException
*/
- void shutdown() throws IOException;
+ void shutdown();
/**
* Sets the Chunk Manager.
http://git-wip-us.apache.org/repos/asf/hadoop/blob/33b51da8/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/KeyManager.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/KeyManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/KeyManager.java
index d33fe9a..bd58a01 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/KeyManager.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/KeyManager.java
@@ -29,13 +29,15 @@ import java.util.List;
public interface KeyManager {
/**
* Puts or overwrites a key.
+ *
* @param pipeline - Pipeline.
- * @param data - Key Data.
+ * @param data - Key Data.
*/
void putKey(Pipeline pipeline, KeyData data) throws IOException;
/**
* Gets an existing key.
+ *
* @param data - Key Data.
* @return Key Data.
*/
@@ -43,21 +45,26 @@ public interface KeyManager {
/**
* Deletes an existing Key.
- * @param pipeline - Pipeline.
- * @param keyName Key Data.
+ *
+ * @param pipeline - Pipeline.
+ * @param keyName Key Data.
*/
void deleteKey(Pipeline pipeline, String keyName) throws IOException;
/**
* List keys in a container.
+ *
* @param pipeline - pipeline.
- * @param prefix - Prefix in needed.
- * @param prevKey - Key to Start from, EMPTY_STRING to begin.
- * @param count - Number of keys to return.
+ * @param prefix - Prefix in needed.
+ * @param prevKey - Key to Start from, EMPTY_STRING to begin.
+ * @param count - Number of keys to return.
* @return List of Keys that match the criteria.
*/
List<KeyData> listKey(Pipeline pipeline, String prefix, String prevKey, int
count);
-
+ /**
+ * Shutdown keyManager.
+ */
+ void shutdown();
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/33b51da8/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/XceiverServer.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/XceiverServer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/XceiverServer.java
index 628b741..0b7c200 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/XceiverServer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/XceiverServer.java
@@ -78,7 +78,7 @@ public final class XceiverServer {
*
* @throws Exception
*/
- public void stop() throws Exception {
+ public void stop() {
if (bossGroup != null) {
bossGroup.shutdownGracefully();
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/33b51da8/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java
index bf03faf..ac99ebb 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java
@@ -92,20 +92,4 @@ public class ContainerCache extends LRUMap {
lock.unlock();
}
}
-
- /**
- * Remove an entry from the cache.
- *
- * @param containerName - Name of the container.
- */
- public void removeDB(String containerName) {
- Preconditions.checkNotNull(containerName);
- Preconditions.checkState(!containerName.isEmpty());
- lock.lock();
- try {
- this.remove(containerName);
- } finally {
- lock.unlock();
- }
- }
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/33b51da8/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
index 34a2968..c045d02 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
@@ -100,10 +100,48 @@ public class OzoneContainer {
/**
* Stops the ozone container.
- * @throws Exception
+ *
+ * Shutdown logic is not very obvious from the following code.
+ * if you need to modify the logic, please keep these comments in mind.
+ * Here is the shutdown sequence.
+ *
+ * 1. We shutdown the network ports.
+ *
+ * 2. Now we need to wait for all requests in-flight to finish.
+ *
+ * 3. The container manager lock is a read-write lock with "Fairness" enabled.
+ *
+ * 4. This means that the waiting threads are served in a "first-come-first
+ * -served" manner. Please note that this applies to waiting threads only.
+ *
+ * 5. Since write locks are exclusive, if we are waiting to get a lock it
+ * implies that we are waiting for in-flight operations to complete.
+ *
+ * 6. if there are other write operations waiting on the reader-writer lock,
+ * fairness guarantees that they will proceed before the shutdown lock
+ * request.
+ *
+ * 7. Since all operations either take a reader or writer lock of container
+ * manager, we are guaranteed that we are the last operation since we have
+ * closed the network port, and we wait until close is successful.
+ *
+ * 8. We take the writer lock and call shutdown on each of the managers in
+ * reverse order. That is chunkManager, keyManager and containerManager is
+ * shutdown.
+ *
*/
- public void stop() throws Exception {
+ public void stop() {
+ LOG.info("Attempting to stop container services.");
server.stop();
+ try {
+ this.manager.writeLock();
+ this.chunkManager.shutdown();
+ this.keyManager.shutdown();
+ this.manager.shutdown();
+ LOG.info("container services shutdown complete.");
+ } finally {
+ this.manager.writeUnlock();
+ }
}
/**