Skip to content

Commit 6d99ae3

Browse files
author
Colm Dougan
committed
HDDS-14004. EventNotification: Capture data to the completed operation ledger table
1 parent a35410b commit 6d99ae3

12 files changed

Lines changed: 232 additions & 12 deletions

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@
4444
import org.apache.hadoop.ozone.om.OMMetadataManager;
4545
import org.apache.hadoop.ozone.om.S3SecretManager;
4646
import org.apache.hadoop.ozone.om.codec.OMDBDefinition;
47+
import org.apache.hadoop.ozone.om.helpers.OmCompletedRequestInfo;
4748
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
49+
import org.apache.hadoop.ozone.om.response.HasCompletedRequestInfo;
4850
import org.apache.hadoop.ozone.om.response.OMClientResponse;
4951
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
5052
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
@@ -409,6 +411,46 @@ private String addToBatch(Queue<Entry> buffer, BatchOperation batchOperation) {
409411
try {
410412
addToBatchWithTrace(omResponse,
411413
() -> response.checkAndUpdateDB(omMetadataManager, batchOperation));
414+
415+
// This is a strawman approach and requires some discussion
416+
// with the community on approach.
417+
//
418+
// At the moment any response type which we want to capture a
419+
// OmCompletedRequestInfo for is required to implement the
420+
// interface HasCompletedRequestInfo and the method
421+
// getCompletedRequestInfo() and we then have this extra step
422+
// here in the double buffer to capture the rows.
423+
//
424+
// It would seem ideal that the double buffer shouldn't have to
425+
// know/care that there is the concept of capturing this
426+
// OmCompletedRequestInfo row for certain response times but the
427+
// approach described above seemed like the least invasive
428+
// approach overall. I am open to other views.
429+
//
430+
// Other approaches I considered:
431+
// - adding a similar getCompletedRequestInfo method to each
432+
// *request* type which want to capture a row for. The downside
433+
// of this was that since requests are not part of the
434+
// addToBatch flow the OmCompletedRequestInfo instance then had
435+
// to be passed through from the request to the relevant
436+
// response constructors and this created quite a bit of code
437+
// churn which I perceived as messy
438+
//
439+
// * in terms of the actual data capture, rather than this
440+
// "instanceof" approach in this class I toyed with
441+
// having each response type which we want to capture a row for
442+
// capturing it itself in its on implementation of addDBBatch
443+
// (i.e. no need for any new code in this class). This
444+
// seemed to be a bit messier to me in terms of code duplication
445+
//
446+
if (response instanceof HasCompletedRequestInfo) {
447+
OmCompletedRequestInfo completedRequestInfo = ((HasCompletedRequestInfo) response).getCompletedRequestInfo(
448+
entry.getTermIndex().getIndex());
449+
450+
omMetadataManager.getCompletedRequestInfoTable().putWithBatch(
451+
batchOperation, completedRequestInfo.getTrxLogIndex(), completedRequestInfo);
452+
}
453+
412454
} catch (IOException ex) {
413455
// During Adding to RocksDB batch entry got an exception.
414456
// We should terminate the OM.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.hadoop.ozone.om.response;
19+
20+
import org.apache.hadoop.ozone.om.helpers.OmCompletedRequestInfo;
21+
22+
/**
23+
* Interface to define that a response class provides a
24+
* OmCompletedRequestInfo implementation.
25+
*/
26+
public interface HasCompletedRequestInfo {
27+
28+
OmCompletedRequestInfo getCompletedRequestInfo(long trxnLogIndex);
29+
}

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketCreateResponse.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,19 @@
2626
import org.apache.hadoop.hdds.utils.db.BatchOperation;
2727
import org.apache.hadoop.ozone.om.OMMetadataManager;
2828
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
29+
import org.apache.hadoop.ozone.om.helpers.OmCompletedRequestInfo;
2930
import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
3031
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
32+
import org.apache.hadoop.ozone.om.response.HasCompletedRequestInfo;
3133
import org.apache.hadoop.ozone.om.response.OMClientResponse;
3234
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
35+
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
3336

3437
/**
3538
* Response for CreateBucket request.
3639
*/
3740
@CleanupTableInfo(cleanupTables = {BUCKET_TABLE, VOLUME_TABLE})
38-
public final class OMBucketCreateResponse extends OMClientResponse {
41+
public final class OMBucketCreateResponse extends OMClientResponse implements HasCompletedRequestInfo {
3942

4043
private final OmBucketInfo omBucketInfo;
4144
private final OmVolumeArgs omVolumeArgs;
@@ -87,5 +90,16 @@ public OmBucketInfo getOmBucketInfo() {
8790
return omBucketInfo;
8891
}
8992

93+
@Override
94+
public OmCompletedRequestInfo getCompletedRequestInfo(long trxnLogIndex) {
95+
return OmCompletedRequestInfo.newBuilder()
96+
.setTrxLogIndex(trxnLogIndex)
97+
.setCmdType(Type.CreateBucket)
98+
.setCreationTime(System.currentTimeMillis())
99+
.setVolumeName(omBucketInfo.getVolumeName())
100+
.setBucketName(omBucketInfo.getBucketName())
101+
.setOpArgs(new OmCompletedRequestInfo.OperationArgs.CreateBucketArgs())
102+
.build();
103+
}
90104
}
91105

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketDeleteResponse.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,19 @@
2424
import java.io.IOException;
2525
import org.apache.hadoop.hdds.utils.db.BatchOperation;
2626
import org.apache.hadoop.ozone.om.OMMetadataManager;
27+
import org.apache.hadoop.ozone.om.helpers.OmCompletedRequestInfo;
2728
import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
2829
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
30+
import org.apache.hadoop.ozone.om.response.HasCompletedRequestInfo;
2931
import org.apache.hadoop.ozone.om.response.OMClientResponse;
3032
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
33+
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
3134

3235
/**
3336
* Response for DeleteBucket request.
3437
*/
3538
@CleanupTableInfo(cleanupTables = {BUCKET_TABLE, VOLUME_TABLE})
36-
public final class OMBucketDeleteResponse extends OMClientResponse {
39+
public final class OMBucketDeleteResponse extends OMClientResponse implements HasCompletedRequestInfo {
3740

3841
private String volumeName;
3942
private String bucketName;
@@ -89,5 +92,15 @@ public String getBucketName() {
8992
return bucketName;
9093
}
9194

95+
@Override
96+
public OmCompletedRequestInfo getCompletedRequestInfo(long trxnLogIndex) {
97+
return OmCompletedRequestInfo.newBuilder()
98+
.setTrxLogIndex(trxnLogIndex)
99+
.setCmdType(Type.DeleteBucket)
100+
.setCreationTime(System.currentTimeMillis())
101+
.setVolumeName(volumeName)
102+
.setBucketName(bucketName)
103+
.setOpArgs(new OmCompletedRequestInfo.OperationArgs.DeleteBucketArgs())
104+
.build();
105+
}
92106
}
93-

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/file/OMDirectoryCreateResponse.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,22 @@
2626
import org.apache.hadoop.ozone.om.OMMetadataManager;
2727
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
2828
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
29+
import org.apache.hadoop.ozone.om.helpers.OmCompletedRequestInfo;
2930
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
3031
import org.apache.hadoop.ozone.om.request.file.OMDirectoryCreateRequest.Result;
3132
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
33+
import org.apache.hadoop.ozone.om.response.HasCompletedRequestInfo;
3234
import org.apache.hadoop.ozone.om.response.key.OmKeyResponse;
3335
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
36+
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
3437
import org.slf4j.Logger;
3538
import org.slf4j.LoggerFactory;
3639

3740
/**
3841
* Response for create directory request.
3942
*/
4043
@CleanupTableInfo(cleanupTables = {KEY_TABLE})
41-
public class OMDirectoryCreateResponse extends OmKeyResponse {
44+
public class OMDirectoryCreateResponse extends OmKeyResponse implements HasCompletedRequestInfo {
4245

4346
private static final Logger LOG =
4447
LoggerFactory.getLogger(OMDirectoryCreateResponse.class);
@@ -98,4 +101,17 @@ protected void addToDBBatch(OMMetadataManager omMetadataManager,
98101
LOG.debug("Directory already exists. addToDBBatch is a no-op");
99102
}
100103
}
104+
105+
@Override
106+
public OmCompletedRequestInfo getCompletedRequestInfo(long trxnLogIndex) {
107+
return OmCompletedRequestInfo.newBuilder()
108+
.setTrxLogIndex(trxnLogIndex)
109+
.setCmdType(Type.CreateDirectory)
110+
.setCreationTime(System.currentTimeMillis())
111+
.setVolumeName(dirKeyInfo.getVolumeName())
112+
.setBucketName(dirKeyInfo.getBucketName())
113+
.setKeyName(dirKeyInfo.getKeyName())
114+
.setOpArgs(new OmCompletedRequestInfo.OperationArgs.CreateDirectoryArgs())
115+
.build();
116+
}
101117
}

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/file/OMFileCreateResponse.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
import java.util.List;
2525
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
2626
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
27+
import org.apache.hadoop.ozone.om.helpers.OmCompletedRequestInfo;
2728
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
2829
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
2930
import org.apache.hadoop.ozone.om.response.key.OMKeyCreateResponse;
3031
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
32+
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
3133

3234
/**
3335
* Response for crate file request.
@@ -53,4 +55,20 @@ public OMFileCreateResponse(@Nonnull OMResponse omResponse, @Nonnull
5355
checkStatusNotOK();
5456
}
5557

58+
@Override
59+
public OmCompletedRequestInfo getCompletedRequestInfo(long trxnLogIndex) {
60+
OmKeyInfo keyInfo = getOmKeyInfo();
61+
boolean isRecursive = false; // ???
62+
boolean isOverwrite = false; // ???
63+
64+
return OmCompletedRequestInfo.newBuilder()
65+
.setTrxLogIndex(trxnLogIndex)
66+
.setCmdType(Type.CreateFile)
67+
.setCreationTime(System.currentTimeMillis())
68+
.setVolumeName(keyInfo.getVolumeName())
69+
.setBucketName(keyInfo.getBucketName())
70+
.setKeyName(keyInfo.getKeyName())
71+
.setOpArgs(new OmCompletedRequestInfo.OperationArgs.CreateFileArgs(isRecursive, isOverwrite))
72+
.build();
73+
}
5674
}

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyCommitResponse.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,20 @@
3030
import org.apache.hadoop.ozone.om.OMMetadataManager;
3131
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
3232
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
33+
import org.apache.hadoop.ozone.om.helpers.OmCompletedRequestInfo;
3334
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
3435
import org.apache.hadoop.ozone.om.helpers.RepeatedOmKeyInfo;
3536
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
37+
import org.apache.hadoop.ozone.om.response.HasCompletedRequestInfo;
3638
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
39+
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
3740

3841
/**
3942
* Response for CommitKey request.
4043
*/
4144
@CleanupTableInfo(cleanupTables = {OPEN_KEY_TABLE, KEY_TABLE, DELETED_TABLE,
4245
BUCKET_TABLE})
43-
public class OMKeyCommitResponse extends OmKeyResponse {
46+
public class OMKeyCommitResponse extends OmKeyResponse implements HasCompletedRequestInfo {
4447

4548
private OmKeyInfo omKeyInfo;
4649
private String ozoneKeyName;
@@ -154,4 +157,17 @@ protected boolean isHSync() {
154157
public OmKeyInfo getNewOpenKeyInfo() {
155158
return newOpenKeyInfo;
156159
}
160+
161+
@Override
162+
public OmCompletedRequestInfo getCompletedRequestInfo(long trxnLogIndex) {
163+
return OmCompletedRequestInfo.newBuilder()
164+
.setTrxLogIndex(trxnLogIndex)
165+
.setCmdType(Type.CommitKey)
166+
.setCreationTime(System.currentTimeMillis())
167+
.setVolumeName(omKeyInfo.getVolumeName())
168+
.setBucketName(omKeyInfo.getBucketName())
169+
.setKeyName(omKeyInfo.getKeyName())
170+
.setOpArgs(new OmCompletedRequestInfo.OperationArgs.CommitKeyArgs())
171+
.build();
172+
}
157173
}

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyCreateResponse.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,20 @@
2828
import org.apache.hadoop.ozone.om.OMMetadataManager;
2929
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
3030
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
31+
import org.apache.hadoop.ozone.om.helpers.OmCompletedRequestInfo;
3132
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
3233
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
34+
import org.apache.hadoop.ozone.om.response.HasCompletedRequestInfo;
3335
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
36+
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
3437
import org.slf4j.Logger;
3538
import org.slf4j.LoggerFactory;
3639

3740
/**
3841
* Response for CreateKey request.
3942
*/
4043
@CleanupTableInfo(cleanupTables = {OPEN_KEY_TABLE, KEY_TABLE, BUCKET_TABLE})
41-
public class OMKeyCreateResponse extends OmKeyResponse {
44+
public class OMKeyCreateResponse extends OmKeyResponse implements HasCompletedRequestInfo {
4245

4346
protected static final Logger LOG =
4447
LoggerFactory.getLogger(OMKeyCreateResponse.class);
@@ -114,5 +117,18 @@ protected OmKeyInfo getOmKeyInfo() {
114117
protected OmBucketInfo getOmBucketInfo() {
115118
return omBucketInfo;
116119
}
120+
121+
@Override
122+
public OmCompletedRequestInfo getCompletedRequestInfo(long trxnLogIndex) {
123+
return OmCompletedRequestInfo.newBuilder()
124+
.setTrxLogIndex(trxnLogIndex)
125+
.setCmdType(Type.CreateKey)
126+
.setCreationTime(System.currentTimeMillis())
127+
.setVolumeName(omKeyInfo.getVolumeName())
128+
.setBucketName(omKeyInfo.getBucketName())
129+
.setKeyName(omKeyInfo.getKeyName())
130+
.setOpArgs(new OmCompletedRequestInfo.OperationArgs.CreateKeyArgs())
131+
.build();
132+
}
117133
}
118134

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyDeleteResponse.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,18 @@
3030
import org.apache.hadoop.ozone.om.OMMetadataManager;
3131
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
3232
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
33+
import org.apache.hadoop.ozone.om.helpers.OmCompletedRequestInfo;
3334
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
3435
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
36+
import org.apache.hadoop.ozone.om.response.HasCompletedRequestInfo;
3537
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
38+
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
3639

3740
/**
3841
* Response for DeleteKey request.
3942
*/
4043
@CleanupTableInfo(cleanupTables = {KEY_TABLE, OPEN_KEY_TABLE, DELETED_TABLE, BUCKET_TABLE})
41-
public class OMKeyDeleteResponse extends AbstractOMKeyDeleteResponse {
44+
public class OMKeyDeleteResponse extends AbstractOMKeyDeleteResponse implements HasCompletedRequestInfo {
4245

4346
private OmKeyInfo omKeyInfo;
4447
private OmBucketInfo omBucketInfo;
@@ -107,4 +110,16 @@ protected OmBucketInfo getOmBucketInfo() {
107110
return omBucketInfo;
108111
}
109112

113+
@Override
114+
public OmCompletedRequestInfo getCompletedRequestInfo(long trxnLogIndex) {
115+
return OmCompletedRequestInfo.newBuilder()
116+
.setTrxLogIndex(trxnLogIndex)
117+
.setCmdType(Type.DeleteKey)
118+
.setCreationTime(System.currentTimeMillis())
119+
.setVolumeName(omKeyInfo.getVolumeName())
120+
.setBucketName(omKeyInfo.getBucketName())
121+
.setKeyName(omKeyInfo.getKeyName())
122+
.setOpArgs(new OmCompletedRequestInfo.OperationArgs.DeleteKeyArgs())
123+
.build();
124+
}
110125
}

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyRenameResponse.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,19 @@
2525
import org.apache.hadoop.hdds.utils.db.BatchOperation;
2626
import org.apache.hadoop.ozone.om.OMMetadataManager;
2727
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
28+
import org.apache.hadoop.ozone.om.helpers.OmCompletedRequestInfo;
2829
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
2930
import org.apache.hadoop.ozone.om.request.OMClientRequestUtils;
3031
import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
32+
import org.apache.hadoop.ozone.om.response.HasCompletedRequestInfo;
3133
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
34+
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
3235

3336
/**
3437
* Response for RenameKey request.
3538
*/
3639
@CleanupTableInfo(cleanupTables = {KEY_TABLE, SNAPSHOT_RENAMED_TABLE})
37-
public class OMKeyRenameResponse extends OmKeyResponse {
40+
public class OMKeyRenameResponse extends OmKeyResponse implements HasCompletedRequestInfo {
3841

3942
private String fromKeyName;
4043
private String toKeyName;
@@ -107,4 +110,17 @@ public String getFromKeyName() {
107110
public String getToKeyName() {
108111
return toKeyName;
109112
}
113+
114+
@Override
115+
public OmCompletedRequestInfo getCompletedRequestInfo(long trxnLogIndex) {
116+
return OmCompletedRequestInfo.newBuilder()
117+
.setTrxLogIndex(trxnLogIndex)
118+
.setCmdType(Type.RenameKey)
119+
.setCreationTime(System.currentTimeMillis())
120+
.setVolumeName(renameKeyInfo.getVolumeName())
121+
.setBucketName(renameKeyInfo.getBucketName())
122+
.setKeyName(renameKeyInfo.getKeyName())
123+
.setOpArgs(new OmCompletedRequestInfo.OperationArgs.RenameKeyArgs(toKeyName))
124+
.build();
125+
}
110126
}

0 commit comments

Comments
 (0)