@@ -99,10 +99,14 @@ public OzoneManagerLock(Configuration conf) {
99
99
*
100
100
* Special Note for UserLock: Single thread can acquire single user lock/
101
101
* multi user lock. But not both at the same time.
102
- * @param resourceName - Resource name on which user want to acquire lock.
103
102
* @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.
104
107
*/
105
- public void acquireLock (String resourceName , Resource resource ) {
108
+ public void acquireLock (Resource resource , String ... resources ) {
109
+ String resourceName = generateResourceName (resource , resources );
106
110
if (!resource .canLock (lockSet .get ())) {
107
111
String errorMessage = getErrorMessage (resource );
108
112
LOG .error (errorMessage );
@@ -115,6 +119,24 @@ public void acquireLock(String resourceName, Resource resource) {
115
119
}
116
120
}
117
121
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
+
118
140
private String getErrorMessage (Resource resource ) {
119
141
return "Thread '" + Thread .currentThread ().getName () + "' cannot " +
120
142
"acquire " + resource .name + " lock while holding " +
@@ -124,7 +146,6 @@ private String getErrorMessage(Resource resource) {
124
146
125
147
private List <String > getCurrentLocks () {
126
148
List <String > currentLocks = new ArrayList <>();
127
- int i =0 ;
128
149
short lockSetVal = lockSet .get ();
129
150
for (Resource value : Resource .values ()) {
130
151
if (value .isLevelLocked (lockSetVal )) {
@@ -141,6 +162,9 @@ private List<String> getCurrentLocks() {
141
162
*/
142
163
public void acquireMultiUserLock (String firstUser , String secondUser ) {
143
164
Resource resource = Resource .USER ;
165
+ firstUser = generateResourceName (resource , firstUser );
166
+ secondUser = generateResourceName (resource , secondUser );
167
+
144
168
if (!resource .canLock (lockSet .get ())) {
145
169
String errorMessage = getErrorMessage (resource );
146
170
LOG .error (errorMessage );
@@ -199,10 +223,12 @@ public void acquireMultiUserLock(String firstUser, String secondUser) {
199
223
*/
200
224
public void releaseMultiUserLock (String firstUser , String secondUser ) {
201
225
Resource resource = Resource .USER ;
226
+ firstUser = generateResourceName (resource , firstUser );
227
+ secondUser = generateResourceName (resource , secondUser );
228
+
202
229
int compare = firstUser .compareTo (secondUser );
203
230
204
231
String temp ;
205
-
206
232
// Order the user names in sorted order. Swap them.
207
233
if (compare > 0 ) {
208
234
temp = secondUser ;
@@ -222,9 +248,16 @@ public void releaseMultiUserLock(String firstUser, String secondUser) {
222
248
lockSet .set (resource .clearLock (lockSet .get ()));
223
249
}
224
250
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 );
228
261
// TODO: Not checking release of higher order level lock happened while
229
262
// releasing lower order level lock, as for that we need counter for
230
263
// locks, as some locks support acquiring lock again.
0 commit comments