Skip to content

Commit 25c421b

Browse files
HDDS-1393. Convert all OM Bucket related operations to HA model. (#704)
1 parent 358e928 commit 25c421b

File tree

10 files changed

+433
-25
lines changed

10 files changed

+433
-25
lines changed

hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerHAProtocol.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
package org.apache.hadoop.ozone.om.protocol;
2020

21+
import org.apache.hadoop.ozone.om.helpers.OmBucketArgs;
22+
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
2123
import org.apache.hadoop.ozone.om.helpers.OmDeleteVolumeResponse;
2224
import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
2325
import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo;
@@ -166,4 +168,54 @@ void applySetOwner(String oldOwner, VolumeList oldOwnerVolumeList,
166168
*/
167169
void applyDeleteVolume(String volume, String owner,
168170
VolumeList newVolumeList) throws IOException;
171+
172+
/**
173+
* Start Create Bucket Transaction.
174+
* @param omBucketInfo
175+
* @return OmBucketInfo
176+
* @throws IOException
177+
*/
178+
OmBucketInfo startCreateBucket(OmBucketInfo omBucketInfo) throws IOException;
179+
180+
/**
181+
* Apply Create Bucket Changes to OM DB.
182+
* @param omBucketInfo
183+
* @throws IOException
184+
*/
185+
void applyCreateBucket(OmBucketInfo omBucketInfo) throws IOException;
186+
187+
/**
188+
* Start Delete Bucket Transaction.
189+
* @param volumeName
190+
* @param bucketName
191+
* @throws IOException
192+
*/
193+
void startDeleteBucket(String volumeName, String bucketName)
194+
throws IOException;
195+
196+
/**
197+
* Apply Delete Bucket changes to OM DB.
198+
* @param volumeName
199+
* @param bucketName
200+
* @throws IOException
201+
*/
202+
void applyDeleteBucket(String volumeName, String bucketName)
203+
throws IOException;
204+
205+
/**
206+
* Start SetBucket Property Transaction.
207+
* @param omBucketArgs
208+
* @return OmBucketInfo
209+
* @throws IOException
210+
*/
211+
OmBucketInfo startSetBucketProperty(OmBucketArgs omBucketArgs)
212+
throws IOException;
213+
214+
/**
215+
* Apply SetBucket Property changes to OM DB.
216+
* @param omBucketInfo
217+
* @throws IOException
218+
*/
219+
void applySetBucketProperty(OmBucketInfo omBucketInfo) throws IOException;
220+
169221
}

hadoop-ozone/common/src/main/proto/OzoneManagerProtocol.proto

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,11 @@ message InfoBucketResponse {
478478
}
479479

480480
message SetBucketPropertyRequest {
481-
required BucketArgs bucketArgs = 1;
481+
//TODO: See if we can merge bucketArgs and bucketInfo
482+
optional BucketArgs bucketArgs = 1;
483+
// This will be set during startTransaction, and used to apply to OM DB
484+
// during applyTransaction.
485+
optional BucketInfo bucketInfo = 2;
482486
}
483487

484488
message SetBucketPropertyResponse {

hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,11 @@ public void testBucketOps() throws IOException {
171171
Mockito.doNothing().when(mockS3Bm).deleteS3Bucket("random");
172172
Mockito.doReturn(true).when(mockS3Bm).createOzoneVolumeIfNeeded(null);
173173

174-
Mockito.doNothing().when(mockBm).createBucket(null);
175-
Mockito.doNothing().when(mockBm).createBucket(null);
174+
Mockito.doReturn(null).when(mockBm).createBucket(null);
175+
Mockito.doReturn(null).when(mockBm).createBucket(null);
176176
Mockito.doNothing().when(mockBm).deleteBucket(null, null);
177177
Mockito.doReturn(null).when(mockBm).getBucketInfo(null, null);
178-
Mockito.doNothing().when(mockBm).setBucketProperty(null);
178+
Mockito.doReturn(null).when(mockBm).setBucketProperty(null);
179179
Mockito.doReturn(null).when(mockBm).listBuckets(null, null, null, 0);
180180

181181
HddsWhiteboxTestUtils.setInternalState(

hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHA.java

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020
import org.apache.hadoop.hdds.client.ReplicationFactor;
2121
import org.apache.hadoop.hdds.client.ReplicationType;
2222
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
23+
import org.apache.hadoop.hdds.protocol.StorageType;
2324
import org.apache.hadoop.hdfs.LogVerificationAppender;
2425
import org.apache.hadoop.ipc.RemoteException;
2526
import org.apache.hadoop.ozone.MiniOzoneCluster;
2627
import org.apache.hadoop.ozone.MiniOzoneHAClusterImpl;
2728
import org.apache.hadoop.ozone.OzoneTestUtils;
29+
import org.apache.hadoop.ozone.client.BucketArgs;
2830
import org.apache.hadoop.ozone.client.ObjectStore;
2931
import org.apache.hadoop.ozone.client.OzoneBucket;
3032
import org.apache.hadoop.ozone.client.OzoneClient;
@@ -38,6 +40,7 @@
3840
import org.apache.hadoop.ozone.client.OzoneClientFactory;
3941
import org.apache.hadoop.ozone.client.OzoneVolume;
4042
import org.apache.hadoop.ozone.client.VolumeArgs;
43+
import org.apache.hadoop.util.Time;
4144
import org.apache.log4j.Logger;
4245
import org.junit.After;
4346
import org.junit.Assert;
@@ -125,23 +128,32 @@ public void shutdown() {
125128
}
126129
}
127130

128-
@Test
129-
public void testAllVolumeOperations() throws Exception {
131+
132+
private OzoneVolume createAndCheckVolume(String volumeName)
133+
throws Exception {
130134
String userName = "user" + RandomStringUtils.randomNumeric(5);
131135
String adminName = "admin" + RandomStringUtils.randomNumeric(5);
132-
String volumeName = "volume" + RandomStringUtils.randomNumeric(5);
133-
134136
VolumeArgs createVolumeArgs = VolumeArgs.newBuilder()
135137
.setOwner(userName)
136138
.setAdmin(adminName)
137139
.build();
138140

139141
objectStore.createVolume(volumeName, createVolumeArgs);
140-
OzoneVolume retVolumeinfo = objectStore.getVolume(volumeName);
141142

142-
Assert.assertTrue(retVolumeinfo.getName().equals(volumeName));
143-
Assert.assertTrue(retVolumeinfo.getOwner().equals(userName));
144-
Assert.assertTrue(retVolumeinfo.getAdmin().equals(adminName));
143+
OzoneVolume retVolume = objectStore.getVolume(volumeName);
144+
145+
Assert.assertTrue(retVolume.getName().equals(volumeName));
146+
Assert.assertTrue(retVolume.getOwner().equals(userName));
147+
Assert.assertTrue(retVolume.getAdmin().equals(adminName));
148+
149+
return retVolume;
150+
}
151+
@Test
152+
public void testAllVolumeOperations() throws Exception {
153+
154+
String volumeName = "volume" + RandomStringUtils.randomNumeric(5);
155+
156+
createAndCheckVolume(volumeName);
145157

146158
objectStore.deleteVolume(volumeName);
147159

@@ -152,6 +164,47 @@ public void testAllVolumeOperations() throws Exception {
152164
() -> objectStore.deleteVolume(volumeName));
153165
}
154166

167+
168+
@Test
169+
public void testAllBucketOperations() throws Exception {
170+
171+
String volumeName = "volume" + RandomStringUtils.randomNumeric(5);
172+
String bucketName = "volume" + RandomStringUtils.randomNumeric(5);
173+
174+
OzoneVolume retVolume = createAndCheckVolume(volumeName);
175+
176+
BucketArgs bucketArgs =
177+
BucketArgs.newBuilder().setStorageType(StorageType.DISK)
178+
.setVersioning(true).build();
179+
180+
181+
retVolume.createBucket(bucketName, bucketArgs);
182+
183+
184+
OzoneBucket ozoneBucket = retVolume.getBucket(bucketName);
185+
186+
Assert.assertEquals(volumeName, ozoneBucket.getVolumeName());
187+
Assert.assertEquals(bucketName, ozoneBucket.getName());
188+
Assert.assertTrue(ozoneBucket.getVersioning());
189+
Assert.assertEquals(StorageType.DISK, ozoneBucket.getStorageType());
190+
Assert.assertTrue(ozoneBucket.getCreationTime() <= Time.now());
191+
192+
193+
// Change versioning to false
194+
ozoneBucket.setVersioning(false);
195+
196+
ozoneBucket = retVolume.getBucket(bucketName);
197+
Assert.assertFalse(ozoneBucket.getVersioning());
198+
199+
retVolume.deleteBucket(bucketName);
200+
201+
OzoneTestUtils.expectOmException(OMException.ResultCodes.BUCKET_NOT_FOUND,
202+
() -> retVolume.deleteBucket(bucketName));
203+
204+
205+
206+
}
207+
155208
/**
156209
* Test a client request when all OM nodes are running. The request should
157210
* succeed.

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManager.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,16 @@ public interface BucketManager {
3030
* Creates a bucket.
3131
* @param bucketInfo - OmBucketInfo for creating bucket.
3232
*/
33-
void createBucket(OmBucketInfo bucketInfo) throws IOException;
33+
OmBucketInfo createBucket(OmBucketInfo bucketInfo) throws IOException;
34+
35+
/**
36+
* Apply Create Bucket changes to OM DB.
37+
* @param omBucketInfo
38+
* @throws IOException
39+
*/
40+
void applyCreateBucket(OmBucketInfo omBucketInfo) throws IOException;
41+
42+
3443
/**
3544
* Returns Bucket Information.
3645
* @param volumeName - Name of the Volume.
@@ -44,7 +53,14 @@ OmBucketInfo getBucketInfo(String volumeName, String bucketName)
4453
* @param args - BucketArgs.
4554
* @throws IOException
4655
*/
47-
void setBucketProperty(OmBucketArgs args) throws IOException;
56+
OmBucketInfo setBucketProperty(OmBucketArgs args) throws IOException;
57+
58+
/**
59+
* Apply SetBucket Property changes to OM DB.
60+
* @param omBucketInfo
61+
* @throws IOException
62+
*/
63+
void applySetBucketProperty(OmBucketInfo omBucketInfo) throws IOException;
4864

4965
/**
5066
* Deletes an existing empty bucket from volume.
@@ -54,6 +70,15 @@ OmBucketInfo getBucketInfo(String volumeName, String bucketName)
5470
*/
5571
void deleteBucket(String volumeName, String bucketName) throws IOException;
5672

73+
/**
74+
* Apply Delete Bucket changes to OM DB.
75+
* @param volumeName
76+
* @param bucketName
77+
* @throws IOException
78+
*/
79+
void applyDeleteBucket(String volumeName, String bucketName)
80+
throws IOException;
81+
5782
/**
5883
* Returns a list of buckets represented by {@link OmBucketInfo}
5984
* in the given volume.

0 commit comments

Comments
 (0)