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 sh...@apache.org on 2018/11/24 21:57:15 UTC
[26/50] [abbrv] hadoop git commit: HDDS-855. Move OMMetadataManager
from hadoop-ozone/ozone-manager to hadoop-ozone/common. Contributed by Ajay
Kumar.
HDDS-855. Move OMMetadataManager from hadoop-ozone/ozone-manager to hadoop-ozone/common. Contributed by Ajay Kumar.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/f994b526
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/f994b526
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/f994b526
Branch: refs/heads/HDFS-12943
Commit: f994b526a03738fea95583a9fccbac709e8ce47f
Parents: a41b648
Author: Xiaoyu Yao <xy...@apache.org>
Authored: Tue Nov 20 20:31:07 2018 -0800
Committer: Xiaoyu Yao <xy...@apache.org>
Committed: Tue Nov 20 20:31:07 2018 -0800
----------------------------------------------------------------------
.../hadoop/ozone/om/OMMetadataManager.java | 245 +++++++++++++++++++
.../hadoop/ozone/om/OzoneManagerLock.java | 222 +++++++++++++++++
.../hadoop/ozone/om/OMMetadataManager.java | 245 -------------------
.../hadoop/ozone/om/OzoneManagerLock.java | 222 -----------------
4 files changed, 467 insertions(+), 467 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hadoop/blob/f994b526/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
----------------------------------------------------------------------
diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
new file mode 100644
index 0000000..5f490ec
--- /dev/null
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
@@ -0,0 +1,245 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.ozone.om;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.apache.hadoop.ozone.common.BlockGroup;
+import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
+import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
+import org.apache.hadoop.utils.db.DBStore;
+import org.apache.hadoop.utils.db.Table;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * OM metadata manager interface.
+ */
+public interface OMMetadataManager {
+ /**
+ * Start metadata manager.
+ */
+ void start();
+
+ /**
+ * Stop metadata manager.
+ */
+ void stop() throws Exception;
+
+ /**
+ * Get metadata store.
+ *
+ * @return metadata store.
+ */
+ @VisibleForTesting
+ DBStore getStore();
+
+ /**
+ * Returns the OzoneManagerLock used on Metadata DB.
+ *
+ * @return OzoneManagerLock
+ */
+ OzoneManagerLock getLock();
+
+ /**
+ * Given a volume return the corresponding DB key.
+ *
+ * @param volume - Volume name
+ */
+ byte[] getVolumeKey(String volume);
+
+ /**
+ * Given a user return the corresponding DB key.
+ *
+ * @param user - User name
+ */
+ byte[] getUserKey(String user);
+
+ /**
+ * Given a volume and bucket, return the corresponding DB key.
+ *
+ * @param volume - User name
+ * @param bucket - Bucket name
+ */
+ byte[] getBucketKey(String volume, String bucket);
+
+ /**
+ * Given a volume, bucket and a key, return the corresponding DB key.
+ *
+ * @param volume - volume name
+ * @param bucket - bucket name
+ * @param key - key name
+ * @return bytes of DB key.
+ */
+ byte[] getOzoneKeyBytes(String volume, String bucket, String key);
+
+ /**
+ * Returns the DB key name of a open key in OM metadata store. Should be
+ * #open# prefix followed by actual key name.
+ *
+ * @param volume - volume name
+ * @param bucket - bucket name
+ * @param key - key name
+ * @param id - the id for this open
+ * @return bytes of DB key.
+ */
+ byte[] getOpenKeyBytes(String volume, String bucket, String key, long id);
+
+ /**
+ * Given a volume, check if it is empty, i.e there are no buckets inside it.
+ *
+ * @param volume - Volume name
+ */
+ boolean isVolumeEmpty(String volume) throws IOException;
+
+ /**
+ * Given a volume/bucket, check if it is empty, i.e there are no keys inside
+ * it.
+ *
+ * @param volume - Volume name
+ * @param bucket - Bucket name
+ * @return true if the bucket is empty
+ */
+ boolean isBucketEmpty(String volume, String bucket) throws IOException;
+
+ /**
+ * Returns a list of buckets represented by {@link OmBucketInfo} in the given
+ * volume.
+ *
+ * @param volumeName the name of the volume. This argument is required, this
+ * method returns buckets in this given volume.
+ * @param startBucket the start bucket name. Only the buckets whose name is
+ * after this value will be included in the result. This key is excluded from
+ * the result.
+ * @param bucketPrefix bucket name prefix. Only the buckets whose name has
+ * this prefix will be included in the result.
+ * @param maxNumOfBuckets the maximum number of buckets to return. It ensures
+ * the size of the result will not exceed this limit.
+ * @return a list of buckets.
+ * @throws IOException
+ */
+ List<OmBucketInfo> listBuckets(String volumeName, String startBucket,
+ String bucketPrefix, int maxNumOfBuckets)
+ throws IOException;
+
+ /**
+ * Returns a list of keys represented by {@link OmKeyInfo} in the given
+ * bucket.
+ *
+ * @param volumeName the name of the volume.
+ * @param bucketName the name of the bucket.
+ * @param startKey the start key name, only the keys whose name is after this
+ * value will be included in the result. This key is excluded from the
+ * result.
+ * @param keyPrefix key name prefix, only the keys whose name has this prefix
+ * will be included in the result.
+ * @param maxKeys the maximum number of keys to return. It ensures the size of
+ * the result will not exceed this limit.
+ * @return a list of keys.
+ * @throws IOException
+ */
+ List<OmKeyInfo> listKeys(String volumeName,
+ String bucketName, String startKey, String keyPrefix, int maxKeys)
+ throws IOException;
+
+ /**
+ * Returns a list of volumes owned by a given user; if user is null, returns
+ * all volumes.
+ *
+ * @param userName volume owner
+ * @param prefix the volume prefix used to filter the listing result.
+ * @param startKey the start volume name determines where to start listing
+ * from, this key is excluded from the result.
+ * @param maxKeys the maximum number of volumes to return.
+ * @return a list of {@link OmVolumeArgs}
+ * @throws IOException
+ */
+ List<OmVolumeArgs> listVolumes(String userName, String prefix,
+ String startKey, int maxKeys) throws IOException;
+
+ /**
+ * Returns a list of pending deletion key info that ups to the given count.
+ * Each entry is a {@link BlockGroup}, which contains the info about the key
+ * name and all its associated block IDs. A pending deletion key is stored
+ * with #deleting# prefix in OM DB.
+ *
+ * @param count max number of keys to return.
+ * @return a list of {@link BlockGroup} represent keys and blocks.
+ * @throws IOException
+ */
+ List<BlockGroup> getPendingDeletionKeys(int count) throws IOException;
+
+ /**
+ * Returns a list of all still open key info. Which contains the info about
+ * the key name and all its associated block IDs. A pending open key has
+ * prefix #open# in OM DB.
+ *
+ * @return a list of {@link BlockGroup} representing keys and blocks.
+ * @throws IOException
+ */
+ List<BlockGroup> getExpiredOpenKeys() throws IOException;
+
+ /**
+ * Returns the user Table.
+ *
+ * @return UserTable.
+ */
+ Table getUserTable();
+
+ /**
+ * Returns the Volume Table.
+ *
+ * @return VolumeTable.
+ */
+ Table getVolumeTable();
+
+ /**
+ * Returns the BucketTable.
+ *
+ * @return BucketTable.
+ */
+ Table getBucketTable();
+
+ /**
+ * Returns the KeyTable.
+ *
+ * @return KeyTable.
+ */
+ Table getKeyTable();
+
+ /**
+ * Get Deleted Table.
+ *
+ * @return Deleted Table.
+ */
+ Table getDeletedTable();
+
+ /**
+ * Gets the OpenKeyTable.
+ *
+ * @return Table.
+ */
+ Table getOpenKeyTable();
+
+ /**
+ * Gets the S3Bucket to Ozone Volume/bucket mapping table.
+ *
+ * @return Table.
+ */
+ Table getS3Table();
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/f994b526/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerLock.java
----------------------------------------------------------------------
diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerLock.java
new file mode 100644
index 0000000..c5ce9e2
--- /dev/null
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerLock.java
@@ -0,0 +1,222 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.ozone.om;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.ozone.lock.LockManager;
+
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX;
+import static org.apache.hadoop.ozone.OzoneConsts.OM_S3_PREFIX;
+import static org.apache.hadoop.ozone.OzoneConsts.OM_USER_PREFIX;
+
+/**
+ * Provides different locks to handle concurrency in OzoneMaster.
+ * We also maintain lock hierarchy, based on the weight.
+ *
+ * <table>
+ * <caption></caption>
+ * <tr>
+ * <td><b> WEIGHT </b></td> <td><b> LOCK </b></td>
+ * </tr>
+ * <tr>
+ * <td> 0 </td> <td> User Lock </td>
+ * </tr>
+ * <tr>
+ * <td> 1 </td> <td> Volume Lock </td>
+ * </tr>
+ * <tr>
+ * <td> 2 </td> <td> Bucket Lock </td>
+ * </tr>
+ * </table>
+ *
+ * One cannot obtain a lower weight lock while holding a lock with higher
+ * weight. The other way around is possible. <br>
+ * <br>
+ * <p>
+ * For example:
+ * <br>
+ * {@literal ->} acquireVolumeLock (will work)<br>
+ * {@literal +->} acquireBucketLock (will work)<br>
+ * {@literal +-->} acquireUserLock (will throw Exception)<br>
+ * </p>
+ * <br>
+ * To acquire a user lock you should not hold any Volume/Bucket lock. Similarly
+ * to acquire a Volume lock you should not hold any Bucket lock.
+ */
+public final class OzoneManagerLock {
+
+ private static final String VOLUME_LOCK = "volumeLock";
+ private static final String BUCKET_LOCK = "bucketLock";
+ private static final String S3_BUCKET_LOCK = "s3BucketLock";
+
+ private final LockManager<String> manager;
+
+ // To maintain locks held by current thread.
+ private final ThreadLocal<Map<String, AtomicInteger>> myLocks =
+ ThreadLocal.withInitial(
+ () -> ImmutableMap.of(
+ VOLUME_LOCK, new AtomicInteger(0),
+ BUCKET_LOCK, new AtomicInteger(0),
+ S3_BUCKET_LOCK, new AtomicInteger(0)
+ )
+ );
+
+ /**
+ * Creates new OzoneManagerLock instance.
+ * @param conf Configuration object
+ */
+ public OzoneManagerLock(Configuration conf) {
+ manager = new LockManager<>(conf);
+ }
+
+ /**
+ * Acquires user lock on the given resource.
+ *
+ * <p>If the lock is not available then the current thread becomes
+ * disabled for thread scheduling purposes and lies dormant until the
+ * lock has been acquired.
+ *
+ * @param user User on which the lock has to be acquired
+ */
+ public void acquireUserLock(String user) {
+ // Calling thread should not hold any volume or bucket lock.
+ if (hasAnyVolumeLock() || hasAnyBucketLock() || hasAnyS3Lock()) {
+ throw new RuntimeException(
+ "Thread '" + Thread.currentThread().getName() +
+ "' cannot acquire user lock" +
+ " while holding volume, bucket or S3 bucket lock(s).");
+ }
+ manager.lock(OM_USER_PREFIX + user);
+ }
+
+ /**
+ * Releases the user lock on given resource.
+ */
+ public void releaseUserLock(String user) {
+ manager.unlock(OM_USER_PREFIX + user);
+ }
+
+ /**
+ * Acquires volume lock on the given resource.
+ *
+ * <p>If the lock is not available then the current thread becomes
+ * disabled for thread scheduling purposes and lies dormant until the
+ * lock has been acquired.
+ *
+ * @param volume Volume on which the lock has to be acquired
+ */
+ public void acquireVolumeLock(String volume) {
+ // Calling thread should not hold any bucket lock.
+ // You can take an Volume while holding S3 bucket lock, since
+ // semantically an S3 bucket maps to the ozone volume. So we check here
+ // only if ozone bucket lock is taken.
+ if (hasAnyBucketLock()) {
+ throw new RuntimeException(
+ "Thread '" + Thread.currentThread().getName() +
+ "' cannot acquire volume lock while holding bucket lock(s).");
+ }
+ manager.lock(OM_KEY_PREFIX + volume);
+ myLocks.get().get(VOLUME_LOCK).incrementAndGet();
+ }
+
+ /**
+ * Releases the volume lock on given resource.
+ */
+ public void releaseVolumeLock(String volume) {
+ manager.unlock(OM_KEY_PREFIX + volume);
+ myLocks.get().get(VOLUME_LOCK).decrementAndGet();
+ }
+
+ /**
+ * Acquires S3 Bucket lock on the given resource.
+ *
+ * <p>If the lock is not available then the current thread becomes
+ * disabled for thread scheduling purposes and lies dormant until the lock has
+ * been acquired.
+ *
+ * @param s3BucketName S3Bucket Name on which the lock has to be acquired
+ */
+ public void acquireS3Lock(String s3BucketName) {
+ // Calling thread should not hold any bucket lock.
+ // You can take an Volume while holding S3 bucket lock, since
+ // semantically an S3 bucket maps to the ozone volume. So we check here
+ // only if ozone bucket lock is taken.
+ if (hasAnyBucketLock()) {
+ throw new RuntimeException(
+ "Thread '" + Thread.currentThread().getName() +
+ "' cannot acquire S3 bucket lock while holding Ozone bucket " +
+ "lock(s).");
+ }
+ manager.lock(OM_S3_PREFIX + s3BucketName);
+ myLocks.get().get(S3_BUCKET_LOCK).incrementAndGet();
+ }
+
+ /**
+ * Releases the volume lock on given resource.
+ */
+ public void releaseS3Lock(String s3BucketName) {
+ manager.unlock(OM_S3_PREFIX + s3BucketName);
+ myLocks.get().get(S3_BUCKET_LOCK).decrementAndGet();
+ }
+
+ /**
+ * Acquires bucket lock on the given resource.
+ *
+ * <p>If the lock is not available then the current thread becomes
+ * disabled for thread scheduling purposes and lies dormant until the
+ * lock has been acquired.
+ *
+ * @param bucket Bucket on which the lock has to be acquired
+ */
+ public void acquireBucketLock(String volume, String bucket) {
+ manager.lock(OM_KEY_PREFIX + volume + OM_KEY_PREFIX + bucket);
+ myLocks.get().get(BUCKET_LOCK).incrementAndGet();
+ }
+
+ /**
+ * Releases the bucket lock on given resource.
+ */
+ public void releaseBucketLock(String volume, String bucket) {
+ manager.unlock(OM_KEY_PREFIX + volume + OM_KEY_PREFIX + bucket);
+ myLocks.get().get(BUCKET_LOCK).decrementAndGet();
+ }
+
+ /**
+ * Returns true if the current thread holds any volume lock.
+ * @return true if current thread holds volume lock, else false
+ */
+ private boolean hasAnyVolumeLock() {
+ return myLocks.get().get(VOLUME_LOCK).get() != 0;
+ }
+
+ /**
+ * Returns true if the current thread holds any bucket lock.
+ * @return true if current thread holds bucket lock, else false
+ */
+ private boolean hasAnyBucketLock() {
+ return myLocks.get().get(BUCKET_LOCK).get() != 0;
+ }
+
+ private boolean hasAnyS3Lock() {
+ return myLocks.get().get(S3_BUCKET_LOCK).get() != 0;
+ }
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/f994b526/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
----------------------------------------------------------------------
diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
deleted file mode 100644
index 5f490ec..0000000
--- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
+++ /dev/null
@@ -1,245 +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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.ozone.om;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.apache.hadoop.ozone.common.BlockGroup;
-import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
-import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
-import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
-import org.apache.hadoop.utils.db.DBStore;
-import org.apache.hadoop.utils.db.Table;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * OM metadata manager interface.
- */
-public interface OMMetadataManager {
- /**
- * Start metadata manager.
- */
- void start();
-
- /**
- * Stop metadata manager.
- */
- void stop() throws Exception;
-
- /**
- * Get metadata store.
- *
- * @return metadata store.
- */
- @VisibleForTesting
- DBStore getStore();
-
- /**
- * Returns the OzoneManagerLock used on Metadata DB.
- *
- * @return OzoneManagerLock
- */
- OzoneManagerLock getLock();
-
- /**
- * Given a volume return the corresponding DB key.
- *
- * @param volume - Volume name
- */
- byte[] getVolumeKey(String volume);
-
- /**
- * Given a user return the corresponding DB key.
- *
- * @param user - User name
- */
- byte[] getUserKey(String user);
-
- /**
- * Given a volume and bucket, return the corresponding DB key.
- *
- * @param volume - User name
- * @param bucket - Bucket name
- */
- byte[] getBucketKey(String volume, String bucket);
-
- /**
- * Given a volume, bucket and a key, return the corresponding DB key.
- *
- * @param volume - volume name
- * @param bucket - bucket name
- * @param key - key name
- * @return bytes of DB key.
- */
- byte[] getOzoneKeyBytes(String volume, String bucket, String key);
-
- /**
- * Returns the DB key name of a open key in OM metadata store. Should be
- * #open# prefix followed by actual key name.
- *
- * @param volume - volume name
- * @param bucket - bucket name
- * @param key - key name
- * @param id - the id for this open
- * @return bytes of DB key.
- */
- byte[] getOpenKeyBytes(String volume, String bucket, String key, long id);
-
- /**
- * Given a volume, check if it is empty, i.e there are no buckets inside it.
- *
- * @param volume - Volume name
- */
- boolean isVolumeEmpty(String volume) throws IOException;
-
- /**
- * Given a volume/bucket, check if it is empty, i.e there are no keys inside
- * it.
- *
- * @param volume - Volume name
- * @param bucket - Bucket name
- * @return true if the bucket is empty
- */
- boolean isBucketEmpty(String volume, String bucket) throws IOException;
-
- /**
- * Returns a list of buckets represented by {@link OmBucketInfo} in the given
- * volume.
- *
- * @param volumeName the name of the volume. This argument is required, this
- * method returns buckets in this given volume.
- * @param startBucket the start bucket name. Only the buckets whose name is
- * after this value will be included in the result. This key is excluded from
- * the result.
- * @param bucketPrefix bucket name prefix. Only the buckets whose name has
- * this prefix will be included in the result.
- * @param maxNumOfBuckets the maximum number of buckets to return. It ensures
- * the size of the result will not exceed this limit.
- * @return a list of buckets.
- * @throws IOException
- */
- List<OmBucketInfo> listBuckets(String volumeName, String startBucket,
- String bucketPrefix, int maxNumOfBuckets)
- throws IOException;
-
- /**
- * Returns a list of keys represented by {@link OmKeyInfo} in the given
- * bucket.
- *
- * @param volumeName the name of the volume.
- * @param bucketName the name of the bucket.
- * @param startKey the start key name, only the keys whose name is after this
- * value will be included in the result. This key is excluded from the
- * result.
- * @param keyPrefix key name prefix, only the keys whose name has this prefix
- * will be included in the result.
- * @param maxKeys the maximum number of keys to return. It ensures the size of
- * the result will not exceed this limit.
- * @return a list of keys.
- * @throws IOException
- */
- List<OmKeyInfo> listKeys(String volumeName,
- String bucketName, String startKey, String keyPrefix, int maxKeys)
- throws IOException;
-
- /**
- * Returns a list of volumes owned by a given user; if user is null, returns
- * all volumes.
- *
- * @param userName volume owner
- * @param prefix the volume prefix used to filter the listing result.
- * @param startKey the start volume name determines where to start listing
- * from, this key is excluded from the result.
- * @param maxKeys the maximum number of volumes to return.
- * @return a list of {@link OmVolumeArgs}
- * @throws IOException
- */
- List<OmVolumeArgs> listVolumes(String userName, String prefix,
- String startKey, int maxKeys) throws IOException;
-
- /**
- * Returns a list of pending deletion key info that ups to the given count.
- * Each entry is a {@link BlockGroup}, which contains the info about the key
- * name and all its associated block IDs. A pending deletion key is stored
- * with #deleting# prefix in OM DB.
- *
- * @param count max number of keys to return.
- * @return a list of {@link BlockGroup} represent keys and blocks.
- * @throws IOException
- */
- List<BlockGroup> getPendingDeletionKeys(int count) throws IOException;
-
- /**
- * Returns a list of all still open key info. Which contains the info about
- * the key name and all its associated block IDs. A pending open key has
- * prefix #open# in OM DB.
- *
- * @return a list of {@link BlockGroup} representing keys and blocks.
- * @throws IOException
- */
- List<BlockGroup> getExpiredOpenKeys() throws IOException;
-
- /**
- * Returns the user Table.
- *
- * @return UserTable.
- */
- Table getUserTable();
-
- /**
- * Returns the Volume Table.
- *
- * @return VolumeTable.
- */
- Table getVolumeTable();
-
- /**
- * Returns the BucketTable.
- *
- * @return BucketTable.
- */
- Table getBucketTable();
-
- /**
- * Returns the KeyTable.
- *
- * @return KeyTable.
- */
- Table getKeyTable();
-
- /**
- * Get Deleted Table.
- *
- * @return Deleted Table.
- */
- Table getDeletedTable();
-
- /**
- * Gets the OpenKeyTable.
- *
- * @return Table.
- */
- Table getOpenKeyTable();
-
- /**
- * Gets the S3Bucket to Ozone Volume/bucket mapping table.
- *
- * @return Table.
- */
- Table getS3Table();
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/f994b526/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerLock.java
----------------------------------------------------------------------
diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerLock.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerLock.java
deleted file mode 100644
index c5ce9e2..0000000
--- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerLock.java
+++ /dev/null
@@ -1,222 +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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.ozone.om;
-
-import com.google.common.collect.ImmutableMap;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.ozone.lock.LockManager;
-
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX;
-import static org.apache.hadoop.ozone.OzoneConsts.OM_S3_PREFIX;
-import static org.apache.hadoop.ozone.OzoneConsts.OM_USER_PREFIX;
-
-/**
- * Provides different locks to handle concurrency in OzoneMaster.
- * We also maintain lock hierarchy, based on the weight.
- *
- * <table>
- * <caption></caption>
- * <tr>
- * <td><b> WEIGHT </b></td> <td><b> LOCK </b></td>
- * </tr>
- * <tr>
- * <td> 0 </td> <td> User Lock </td>
- * </tr>
- * <tr>
- * <td> 1 </td> <td> Volume Lock </td>
- * </tr>
- * <tr>
- * <td> 2 </td> <td> Bucket Lock </td>
- * </tr>
- * </table>
- *
- * One cannot obtain a lower weight lock while holding a lock with higher
- * weight. The other way around is possible. <br>
- * <br>
- * <p>
- * For example:
- * <br>
- * {@literal ->} acquireVolumeLock (will work)<br>
- * {@literal +->} acquireBucketLock (will work)<br>
- * {@literal +-->} acquireUserLock (will throw Exception)<br>
- * </p>
- * <br>
- * To acquire a user lock you should not hold any Volume/Bucket lock. Similarly
- * to acquire a Volume lock you should not hold any Bucket lock.
- */
-public final class OzoneManagerLock {
-
- private static final String VOLUME_LOCK = "volumeLock";
- private static final String BUCKET_LOCK = "bucketLock";
- private static final String S3_BUCKET_LOCK = "s3BucketLock";
-
- private final LockManager<String> manager;
-
- // To maintain locks held by current thread.
- private final ThreadLocal<Map<String, AtomicInteger>> myLocks =
- ThreadLocal.withInitial(
- () -> ImmutableMap.of(
- VOLUME_LOCK, new AtomicInteger(0),
- BUCKET_LOCK, new AtomicInteger(0),
- S3_BUCKET_LOCK, new AtomicInteger(0)
- )
- );
-
- /**
- * Creates new OzoneManagerLock instance.
- * @param conf Configuration object
- */
- public OzoneManagerLock(Configuration conf) {
- manager = new LockManager<>(conf);
- }
-
- /**
- * Acquires user lock on the given resource.
- *
- * <p>If the lock is not available then the current thread becomes
- * disabled for thread scheduling purposes and lies dormant until the
- * lock has been acquired.
- *
- * @param user User on which the lock has to be acquired
- */
- public void acquireUserLock(String user) {
- // Calling thread should not hold any volume or bucket lock.
- if (hasAnyVolumeLock() || hasAnyBucketLock() || hasAnyS3Lock()) {
- throw new RuntimeException(
- "Thread '" + Thread.currentThread().getName() +
- "' cannot acquire user lock" +
- " while holding volume, bucket or S3 bucket lock(s).");
- }
- manager.lock(OM_USER_PREFIX + user);
- }
-
- /**
- * Releases the user lock on given resource.
- */
- public void releaseUserLock(String user) {
- manager.unlock(OM_USER_PREFIX + user);
- }
-
- /**
- * Acquires volume lock on the given resource.
- *
- * <p>If the lock is not available then the current thread becomes
- * disabled for thread scheduling purposes and lies dormant until the
- * lock has been acquired.
- *
- * @param volume Volume on which the lock has to be acquired
- */
- public void acquireVolumeLock(String volume) {
- // Calling thread should not hold any bucket lock.
- // You can take an Volume while holding S3 bucket lock, since
- // semantically an S3 bucket maps to the ozone volume. So we check here
- // only if ozone bucket lock is taken.
- if (hasAnyBucketLock()) {
- throw new RuntimeException(
- "Thread '" + Thread.currentThread().getName() +
- "' cannot acquire volume lock while holding bucket lock(s).");
- }
- manager.lock(OM_KEY_PREFIX + volume);
- myLocks.get().get(VOLUME_LOCK).incrementAndGet();
- }
-
- /**
- * Releases the volume lock on given resource.
- */
- public void releaseVolumeLock(String volume) {
- manager.unlock(OM_KEY_PREFIX + volume);
- myLocks.get().get(VOLUME_LOCK).decrementAndGet();
- }
-
- /**
- * Acquires S3 Bucket lock on the given resource.
- *
- * <p>If the lock is not available then the current thread becomes
- * disabled for thread scheduling purposes and lies dormant until the lock has
- * been acquired.
- *
- * @param s3BucketName S3Bucket Name on which the lock has to be acquired
- */
- public void acquireS3Lock(String s3BucketName) {
- // Calling thread should not hold any bucket lock.
- // You can take an Volume while holding S3 bucket lock, since
- // semantically an S3 bucket maps to the ozone volume. So we check here
- // only if ozone bucket lock is taken.
- if (hasAnyBucketLock()) {
- throw new RuntimeException(
- "Thread '" + Thread.currentThread().getName() +
- "' cannot acquire S3 bucket lock while holding Ozone bucket " +
- "lock(s).");
- }
- manager.lock(OM_S3_PREFIX + s3BucketName);
- myLocks.get().get(S3_BUCKET_LOCK).incrementAndGet();
- }
-
- /**
- * Releases the volume lock on given resource.
- */
- public void releaseS3Lock(String s3BucketName) {
- manager.unlock(OM_S3_PREFIX + s3BucketName);
- myLocks.get().get(S3_BUCKET_LOCK).decrementAndGet();
- }
-
- /**
- * Acquires bucket lock on the given resource.
- *
- * <p>If the lock is not available then the current thread becomes
- * disabled for thread scheduling purposes and lies dormant until the
- * lock has been acquired.
- *
- * @param bucket Bucket on which the lock has to be acquired
- */
- public void acquireBucketLock(String volume, String bucket) {
- manager.lock(OM_KEY_PREFIX + volume + OM_KEY_PREFIX + bucket);
- myLocks.get().get(BUCKET_LOCK).incrementAndGet();
- }
-
- /**
- * Releases the bucket lock on given resource.
- */
- public void releaseBucketLock(String volume, String bucket) {
- manager.unlock(OM_KEY_PREFIX + volume + OM_KEY_PREFIX + bucket);
- myLocks.get().get(BUCKET_LOCK).decrementAndGet();
- }
-
- /**
- * Returns true if the current thread holds any volume lock.
- * @return true if current thread holds volume lock, else false
- */
- private boolean hasAnyVolumeLock() {
- return myLocks.get().get(VOLUME_LOCK).get() != 0;
- }
-
- /**
- * Returns true if the current thread holds any bucket lock.
- * @return true if current thread holds bucket lock, else false
- */
- private boolean hasAnyBucketLock() {
- return myLocks.get().get(BUCKET_LOCK).get() != 0;
- }
-
- private boolean hasAnyS3Lock() {
- return myLocks.get().get(S3_BUCKET_LOCK).get() != 0;
- }
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org