@@ -99,10 +99,14 @@ public OzoneManagerLock(Configuration conf) {
9999 *
100100 * Special Note for UserLock: Single thread can acquire single user lock/
101101 * multi user lock. But not both at the same time.
102- * @param resourceName - Resource name on which user want to acquire lock.
103102 * @param resource - Type of the resource.
103+ * @param resources - Resource names on which user want to acquire lock.
104+ * For Resource type bucket, first param should be volume, second param
105+ * should be bucket name. For remaining all resource only one param should
106+ * be passed.
104107 */
105- public void acquireLock (String resourceName , Resource resource ) {
108+ public void acquireLock (Resource resource , String ... resources ) {
109+ String resourceName = generateResourceName (resource , resources );
106110 if (!resource .canLock (lockSet .get ())) {
107111 String errorMessage = getErrorMessage (resource );
108112 LOG .error (errorMessage );
@@ -115,6 +119,24 @@ public void acquireLock(String resourceName, Resource resource) {
115119 }
116120 }
117121
122+ /**
123+ * Generate resource name to be locked.
124+ * @param resource
125+ * @param resources
126+ */
127+ private String generateResourceName (Resource resource , String ... resources ) {
128+ if (resources .length == 1 && resource != Resource .BUCKET ) {
129+ return OzoneManagerLockUtil .generateResourceLockName (resource ,
130+ resources [0 ]);
131+ } else if (resources .length == 2 && resource == Resource .BUCKET ) {
132+ return OzoneManagerLockUtil .generateBucketLockName (resources [0 ],
133+ resources [1 ]);
134+ } else {
135+ throw new IllegalArgumentException ("acquire lock is supported on single" +
136+ " resource for all locks except for resource bucket" );
137+ }
138+ }
139+
118140 private String getErrorMessage (Resource resource ) {
119141 return "Thread '" + Thread .currentThread ().getName () + "' cannot " +
120142 "acquire " + resource .name + " lock while holding " +
@@ -124,7 +146,6 @@ private String getErrorMessage(Resource resource) {
124146
125147 private List <String > getCurrentLocks () {
126148 List <String > currentLocks = new ArrayList <>();
127- int i =0 ;
128149 short lockSetVal = lockSet .get ();
129150 for (Resource value : Resource .values ()) {
130151 if (value .isLevelLocked (lockSetVal )) {
@@ -141,6 +162,9 @@ private List<String> getCurrentLocks() {
141162 */
142163 public void acquireMultiUserLock (String firstUser , String secondUser ) {
143164 Resource resource = Resource .USER ;
165+ firstUser = generateResourceName (resource , firstUser );
166+ secondUser = generateResourceName (resource , secondUser );
167+
144168 if (!resource .canLock (lockSet .get ())) {
145169 String errorMessage = getErrorMessage (resource );
146170 LOG .error (errorMessage );
@@ -199,10 +223,12 @@ public void acquireMultiUserLock(String firstUser, String secondUser) {
199223 */
200224 public void releaseMultiUserLock (String firstUser , String secondUser ) {
201225 Resource resource = Resource .USER ;
226+ firstUser = generateResourceName (resource , firstUser );
227+ secondUser = generateResourceName (resource , secondUser );
228+
202229 int compare = firstUser .compareTo (secondUser );
203230
204231 String temp ;
205-
206232 // Order the user names in sorted order. Swap them.
207233 if (compare > 0 ) {
208234 temp = secondUser ;
@@ -222,9 +248,16 @@ public void releaseMultiUserLock(String firstUser, String secondUser) {
222248 lockSet .set (resource .clearLock (lockSet .get ()));
223249 }
224250
225-
226- public void releaseLock (String resourceName , Resource resource ) {
227-
251+ /**
252+ * Release lock on resource.
253+ * @param resource - Type of the resource.
254+ * @param resources - Resource names on which user want to acquire lock.
255+ * For Resource type bucket, first param should be volume, second param
256+ * should be bucket name. For remaining all resource only one param should
257+ * be passed.
258+ */
259+ public void releaseLock (Resource resource , String ... resources ) {
260+ String resourceName = generateResourceName (resource , resources );
228261 // TODO: Not checking release of higher order level lock happened while
229262 // releasing lower order level lock, as for that we need counter for
230263 // locks, as some locks support acquiring lock again.
0 commit comments