You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ozone.apache.org by GitBox <gi...@apache.org> on 2020/05/19 03:16:57 UTC
[GitHub] [hadoop-ozone] bharatviswa504 opened a new pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
bharatviswa504 opened a new pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943
Call cleanup on tables only when the double buffer has transactions related to tables.
## What changes were proposed in this pull request?
(Please fill in changes proposed in this fix)
## What is the link to the Apache JIRA
https://issues.apache.org/jira/browse/HDDS-3615
## How was this patch tested?
Existing tests. Will see if I can add any tests.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] xiaoyuyao commented on a change in pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
xiaoyuyao commented on a change in pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#discussion_r446326983
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketDeleteResponse.java
##########
@@ -19,20 +19,29 @@
package org.apache.hadoop.ozone.om.response.bucket;
import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
import org.apache.hadoop.ozone.om.OMMetadataManager;
+import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.OMResponse;
import org.apache.hadoop.hdds.utils.db.BatchOperation;
import javax.annotation.Nonnull;
+import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.BUCKET_TABLE;
+
/**
* Response for DeleteBucket request.
*/
+@CleanupTableInfo(cleanupTables = {BUCKET_TABLE})
public final class OMBucketDeleteResponse extends OMClientResponse {
+ private static final List<String> OPERATED_TABLES =
Review comment:
Should this be removed after we take the annotation?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] bharatviswa504 commented on pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
bharatviswa504 commented on pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#issuecomment-650426788
Thank You @xiaoyuyao for the review.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] bharatviswa504 commented on a change in pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
bharatviswa504 commented on a change in pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#discussion_r442599075
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketCreateResponse.java
##########
@@ -30,11 +32,16 @@
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
+import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.BUCKET_TABLE;
+
/**
* Response for CreateBucket request.
*/
public final class OMBucketCreateResponse extends OMClientResponse {
Review comment:
Done.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] codecov-commenter commented on pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
codecov-commenter commented on pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#issuecomment-650355292
# [Codecov](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=h1) Report
> Merging [#943](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=desc) into [master](https://codecov.io/gh/apache/hadoop-ozone/commit/f8fcc4760b227308c4a72f06f2e35864e69a1f22&el=desc) will **decrease** coverage by `0.10%`.
> The diff coverage is `73.45%`.
[](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=tree)
```diff
@@ Coverage Diff @@
## master #943 +/- ##
============================================
- Coverage 70.56% 70.45% -0.11%
- Complexity 9427 9445 +18
============================================
Files 965 969 +4
Lines 49063 49321 +258
Branches 4803 4833 +30
============================================
+ Hits 34620 34751 +131
- Misses 12137 12250 +113
- Partials 2306 2320 +14
```
| [Impacted Files](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=tree) | Coverage Δ | Complexity Δ | |
|---|---|---|---|
| [.../java/org/apache/hadoop/ozone/OzoneConfigKeys.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLWhkZHMvY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3Avb3pvbmUvT3pvbmVDb25maWdLZXlzLmphdmE=) | `100.00% <ø> (ø)` | `1.00 <0.00> (ø)` | |
| [...apache/hadoop/hdds/server/http/BaseHttpServer.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLWhkZHMvZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvaGRkcy9zZXJ2ZXIvaHR0cC9CYXNlSHR0cFNlcnZlci5qYXZh) | `77.39% <0.00%> (ø)` | `25.00 <0.00> (ø)` | |
| [...nt/algorithms/ContainerPlacementPolicyFactory.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLWhkZHMvc2VydmVyLXNjbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL2hkZHMvc2NtL2NvbnRhaW5lci9wbGFjZW1lbnQvYWxnb3JpdGhtcy9Db250YWluZXJQbGFjZW1lbnRQb2xpY3lGYWN0b3J5LmphdmE=) | `83.33% <ø> (ø)` | `2.00 <0.00> (ø)` | |
| [...src/main/java/org/apache/hadoop/ozone/OmUtils.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL2NvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL296b25lL09tVXRpbHMuamF2YQ==) | `75.20% <ø> (ø)` | `38.00 <0.00> (ø)` | |
| [...hadoop/ozone/om/protocol/OzoneManagerProtocol.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL2NvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL296b25lL29tL3Byb3RvY29sL096b25lTWFuYWdlclByb3RvY29sLmphdmE=) | `0.00% <ø> (ø)` | `0.00 <0.00> (ø)` | |
| [...g/apache/hadoop/ozone/om/codec/OMDBDefinition.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL296b25lLW1hbmFnZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9vem9uZS9vbS9jb2RlYy9PTURCRGVmaW5pdGlvbi5qYXZh) | `0.00% <0.00%> (ø)` | `0.00 <0.00> (?)` | |
| [...one/om/response/bucket/OMBucketCreateResponse.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL296b25lLW1hbmFnZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9vem9uZS9vbS9yZXNwb25zZS9idWNrZXQvT01CdWNrZXRDcmVhdGVSZXNwb25zZS5qYXZh) | `100.00% <ø> (ø)` | `4.00 <0.00> (ø)` | |
| [...one/om/response/bucket/OMBucketDeleteResponse.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL296b25lLW1hbmFnZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9vem9uZS9vbS9yZXNwb25zZS9idWNrZXQvT01CdWNrZXREZWxldGVSZXNwb25zZS5qYXZh) | `100.00% <ø> (ø)` | `5.00 <0.00> (ø)` | |
| [...m/response/bucket/OMBucketSetPropertyResponse.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL296b25lLW1hbmFnZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9vem9uZS9vbS9yZXNwb25zZS9idWNrZXQvT01CdWNrZXRTZXRQcm9wZXJ0eVJlc3BvbnNlLmphdmE=) | `100.00% <ø> (ø)` | `3.00 <0.00> (ø)` | |
| [...ne/om/response/bucket/acl/OMBucketAclResponse.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL296b25lLW1hbmFnZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9vem9uZS9vbS9yZXNwb25zZS9idWNrZXQvYWNsL09NQnVja2V0QWNsUmVzcG9uc2UuamF2YQ==) | `69.23% <ø> (ø)` | `3.00 <0.00> (ø)` | |
| ... and [88 more](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree-more) | |
------
[Continue to review full report at Codecov](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=footer). Last update [38a4786...35b07d3](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] bharatviswa504 commented on a change in pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
bharatviswa504 commented on a change in pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#discussion_r442596111
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
##########
@@ -286,30 +301,45 @@ private void flushTransactions() {
}
}
- private void cleanupCache(List<Long> lastRatisTransactionIndex) {
- // As now only volume and bucket transactions are handled only called
- // cleanupCache on bucketTable.
- // TODO: After supporting all write operations we need to call
- // cleanupCache on the tables only when buffer has entries for that table.
- omMetadataManager.getBucketTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getVolumeTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getUserTable().cleanupCache(lastRatisTransactionIndex);
-
- //TODO: Optimization we can do here is for key transactions we can only
- // cleanup cache when it is key commit transaction. In this way all
- // intermediate transactions for a key will be read from in-memory cache.
- omMetadataManager.getOpenKeyTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getKeyTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getDeletedTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getS3Table().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getMultipartInfoTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getS3SecretTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getDelegationTokenTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getPrefixTable().cleanupCache(lastRatisTransactionIndex);
+ /**
+ * Set cleanup epoch for the DoubleBufferEntry.
+ * @param entry
+ * @param cleanupEpochs
+ */
+ private void setCleanupEpoch(DoubleBufferEntry entry, Map<String,
+ List<Long>> cleanupEpochs) {
+ // Add epochs depending on operated tables. In this way
+ // cleanup will be called only when required.
+
+ // As bucket and volume table is full cache add cleanup
+ // epochs only when request is delete to cleanup deleted
+ // entries.
+
+ String opName =
+ entry.getResponse().getOMResponse().getCmdType().name();
+
+ if (opName.toLowerCase().contains(VOLUME) ||
+ opName.toLowerCase().contains(BUCKET)) {
+ if (DeleteBucket.name().equals(opName)
+ || DeleteVolume.name().equals(opName)) {
+ entry.getResponse().operatedTables().forEach(
+ table -> cleanupEpochs.get(table)
+ .add(entry.getTrxLogIndex()));
+ }
+ } else {
+ entry.getResponse().operatedTables().forEach(
Review comment:
When operattion is of type volume/bucket entry should be added only when deletevolume/deletebucket. As volume/bucket is full cache, and cache should be cleaned up only for delete operations.
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
##########
@@ -286,30 +301,45 @@ private void flushTransactions() {
}
}
- private void cleanupCache(List<Long> lastRatisTransactionIndex) {
- // As now only volume and bucket transactions are handled only called
- // cleanupCache on bucketTable.
- // TODO: After supporting all write operations we need to call
- // cleanupCache on the tables only when buffer has entries for that table.
- omMetadataManager.getBucketTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getVolumeTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getUserTable().cleanupCache(lastRatisTransactionIndex);
-
- //TODO: Optimization we can do here is for key transactions we can only
- // cleanup cache when it is key commit transaction. In this way all
- // intermediate transactions for a key will be read from in-memory cache.
- omMetadataManager.getOpenKeyTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getKeyTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getDeletedTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getS3Table().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getMultipartInfoTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getS3SecretTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getDelegationTokenTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getPrefixTable().cleanupCache(lastRatisTransactionIndex);
+ /**
+ * Set cleanup epoch for the DoubleBufferEntry.
+ * @param entry
+ * @param cleanupEpochs
+ */
+ private void setCleanupEpoch(DoubleBufferEntry entry, Map<String,
+ List<Long>> cleanupEpochs) {
+ // Add epochs depending on operated tables. In this way
+ // cleanup will be called only when required.
+
+ // As bucket and volume table is full cache add cleanup
+ // epochs only when request is delete to cleanup deleted
+ // entries.
+
+ String opName =
+ entry.getResponse().getOMResponse().getCmdType().name();
+
+ if (opName.toLowerCase().contains(VOLUME) ||
+ opName.toLowerCase().contains(BUCKET)) {
+ if (DeleteBucket.name().equals(opName)
+ || DeleteVolume.name().equals(opName)) {
+ entry.getResponse().operatedTables().forEach(
+ table -> cleanupEpochs.get(table)
+ .add(entry.getTrxLogIndex()));
+ }
+ } else {
+ entry.getResponse().operatedTables().forEach(
Review comment:
When operation is of type volume/bucket entry should be added only when deletevolume/deletebucket. As volume/bucket is full cache, and cache should be cleaned up only for delete operations.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] bharatviswa504 commented on pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
bharatviswa504 commented on pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#issuecomment-650319700
Thanks for the review @xiaoyuyao
Addressed review comments.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] xiaoyuyao commented on a change in pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
xiaoyuyao commented on a change in pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#discussion_r446329661
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
##########
@@ -353,29 +368,62 @@ private void flushTransactions() {
}
}
- private void cleanupCache(List<Long> lastRatisTransactionIndex) {
- // As now only volume and bucket transactions are handled only called
- // cleanupCache on bucketTable.
- // TODO: After supporting all write operations we need to call
- // cleanupCache on the tables only when buffer has entries for that table.
- omMetadataManager.getBucketTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getVolumeTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getUserTable().cleanupCache(lastRatisTransactionIndex);
-
- //TODO: Optimization we can do here is for key transactions we can only
- // cleanup cache when it is key commit transaction. In this way all
- // intermediate transactions for a key will be read from in-memory cache.
- omMetadataManager.getOpenKeyTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getKeyTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getDeletedTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getMultipartInfoTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getS3SecretTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getDelegationTokenTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getPrefixTable().cleanupCache(lastRatisTransactionIndex);
+ /**
+ * Set cleanup epoch for the DoubleBufferEntry.
+ * @param entry
+ * @param cleanupEpochs
+ */
+ private void setCleanupEpoch(DoubleBufferEntry entry, Map<String,
+ List<Long>> cleanupEpochs) {
+ // Add epochs depending on operated tables. In this way
+ // cleanup will be called only when required.
+
+ // As bucket and volume table is full cache add cleanup
+ // epochs only when request is delete to cleanup deleted
+ // entries.
+
+ String opName =
+ entry.getResponse().getOMResponse().getCmdType().name();
+
+ if (opName.toLowerCase().contains(VOLUME) ||
+ opName.toLowerCase().contains(BUCKET)) {
+ if (DeleteBucket.name().equals(opName)
+ || DeleteVolume.name().equals(opName)) {
+ addCleanupEntry(entry, cleanupEpochs);
+ }
+ } else {
+ addCleanupEntry(entry, cleanupEpochs);
+ }
+ }
+
+
+ private void addCleanupEntry(DoubleBufferEntry entry, Map<String,
+ List<Long>> cleanupEpochs) {
+ Class<? extends OMClientResponse> responseClass =
+ entry.getResponse().getClass();
+ CleanupTableInfo cleanupTableInfo =
+ responseClass.getAnnotation(CleanupTableInfo.class);
+ if (cleanupTableInfo != null) {
+ String[] cleanupTables = cleanupTableInfo.cleanupTables();
+ for (String table : cleanupTables) {
+ cleanupEpochs.computeIfAbsent(table, list -> new ArrayList<>())
+ .add(entry.getTrxLogIndex());
+ }
+ } else {
+ // This is to catch early errors, when an new response class missed to
+ // add CleanupTableInfo annotation.
+ throw new RuntimeException("CleanupTableInfo Annotation is missing " +
Review comment:
Can we add a unit test on response class that misses annotation?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] bharatviswa504 commented on pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
bharatviswa504 commented on pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#issuecomment-646836168
Thank You @xiaoyuyao for the review.
Addressed review comments.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] codecov-commenter edited a comment on pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
codecov-commenter edited a comment on pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#issuecomment-650355292
# [Codecov](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=h1) Report
> Merging [#943](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=desc) into [master](https://codecov.io/gh/apache/hadoop-ozone/commit/f8fcc4760b227308c4a72f06f2e35864e69a1f22&el=desc) will **decrease** coverage by `0.08%`.
> The diff coverage is `73.45%`.
[](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=tree)
```diff
@@ Coverage Diff @@
## master #943 +/- ##
============================================
- Coverage 70.56% 70.48% -0.09%
- Complexity 9427 9445 +18
============================================
Files 965 969 +4
Lines 49063 49321 +258
Branches 4803 4833 +30
============================================
+ Hits 34620 34762 +142
- Misses 12137 12239 +102
- Partials 2306 2320 +14
```
| [Impacted Files](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=tree) | Coverage Δ | Complexity Δ | |
|---|---|---|---|
| [.../java/org/apache/hadoop/ozone/OzoneConfigKeys.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLWhkZHMvY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3Avb3pvbmUvT3pvbmVDb25maWdLZXlzLmphdmE=) | `100.00% <ø> (ø)` | `1.00 <0.00> (ø)` | |
| [...apache/hadoop/hdds/server/http/BaseHttpServer.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLWhkZHMvZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvaGRkcy9zZXJ2ZXIvaHR0cC9CYXNlSHR0cFNlcnZlci5qYXZh) | `77.39% <0.00%> (ø)` | `25.00 <0.00> (ø)` | |
| [...nt/algorithms/ContainerPlacementPolicyFactory.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLWhkZHMvc2VydmVyLXNjbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL2hkZHMvc2NtL2NvbnRhaW5lci9wbGFjZW1lbnQvYWxnb3JpdGhtcy9Db250YWluZXJQbGFjZW1lbnRQb2xpY3lGYWN0b3J5LmphdmE=) | `83.33% <ø> (ø)` | `2.00 <0.00> (ø)` | |
| [...src/main/java/org/apache/hadoop/ozone/OmUtils.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL2NvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL296b25lL09tVXRpbHMuamF2YQ==) | `75.20% <ø> (ø)` | `38.00 <0.00> (ø)` | |
| [...hadoop/ozone/om/protocol/OzoneManagerProtocol.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL2NvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL296b25lL29tL3Byb3RvY29sL096b25lTWFuYWdlclByb3RvY29sLmphdmE=) | `0.00% <ø> (ø)` | `0.00 <0.00> (ø)` | |
| [...g/apache/hadoop/ozone/om/codec/OMDBDefinition.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL296b25lLW1hbmFnZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9vem9uZS9vbS9jb2RlYy9PTURCRGVmaW5pdGlvbi5qYXZh) | `0.00% <0.00%> (ø)` | `0.00 <0.00> (?)` | |
| [...one/om/response/bucket/OMBucketCreateResponse.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL296b25lLW1hbmFnZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9vem9uZS9vbS9yZXNwb25zZS9idWNrZXQvT01CdWNrZXRDcmVhdGVSZXNwb25zZS5qYXZh) | `100.00% <ø> (ø)` | `4.00 <0.00> (ø)` | |
| [...one/om/response/bucket/OMBucketDeleteResponse.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL296b25lLW1hbmFnZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9vem9uZS9vbS9yZXNwb25zZS9idWNrZXQvT01CdWNrZXREZWxldGVSZXNwb25zZS5qYXZh) | `100.00% <ø> (ø)` | `5.00 <0.00> (ø)` | |
| [...m/response/bucket/OMBucketSetPropertyResponse.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL296b25lLW1hbmFnZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9vem9uZS9vbS9yZXNwb25zZS9idWNrZXQvT01CdWNrZXRTZXRQcm9wZXJ0eVJlc3BvbnNlLmphdmE=) | `100.00% <ø> (ø)` | `3.00 <0.00> (ø)` | |
| [...ne/om/response/bucket/acl/OMBucketAclResponse.java](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree#diff-aGFkb29wLW96b25lL296b25lLW1hbmFnZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9vem9uZS9vbS9yZXNwb25zZS9idWNrZXQvYWNsL09NQnVja2V0QWNsUmVzcG9uc2UuamF2YQ==) | `69.23% <ø> (ø)` | `3.00 <0.00> (ø)` | |
| ... and [87 more](https://codecov.io/gh/apache/hadoop-ozone/pull/943/diff?src=pr&el=tree-more) | |
------
[Continue to review full report at Codecov](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=footer). Last update [38a4786...35b07d3](https://codecov.io/gh/apache/hadoop-ozone/pull/943?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] xiaoyuyao commented on a change in pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
xiaoyuyao commented on a change in pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#discussion_r428987972
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketCreateResponse.java
##########
@@ -30,11 +32,16 @@
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
+import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.BUCKET_TABLE;
+
/**
* Response for CreateBucket request.
*/
public final class OMBucketCreateResponse extends OMClientResponse {
Review comment:
As an alternative, you might achieve the same by adding a class annotation with table name string.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] xiaoyuyao commented on a change in pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
xiaoyuyao commented on a change in pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#discussion_r446326983
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketDeleteResponse.java
##########
@@ -19,20 +19,29 @@
package org.apache.hadoop.ozone.om.response.bucket;
import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
import org.apache.hadoop.ozone.om.OMMetadataManager;
+import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.OMResponse;
import org.apache.hadoop.hdds.utils.db.BatchOperation;
import javax.annotation.Nonnull;
+import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.BUCKET_TABLE;
+
/**
* Response for DeleteBucket request.
*/
+@CleanupTableInfo(cleanupTables = {BUCKET_TABLE})
public final class OMBucketDeleteResponse extends OMClientResponse {
+ private static final List<String> OPERATED_TABLES =
Review comment:
Should this be removed after we add the annotation?
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketSetPropertyResponse.java
##########
@@ -18,22 +18,31 @@
package org.apache.hadoop.ozone.om.response.bucket;
import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
+import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.OMResponse;
import org.apache.hadoop.hdds.utils.db.BatchOperation;
import javax.annotation.Nonnull;
+import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.BUCKET_TABLE;
+
/**
* Response for SetBucketProperty request.
*/
+@CleanupTableInfo(cleanupTables = {BUCKET_TABLE})
public class OMBucketSetPropertyResponse extends OMClientResponse {
private OmBucketInfo omBucketInfo;
+ private static final List<String> OPERATED_TABLES =
Review comment:
Same as above.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] xiaoyuyao commented on a change in pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
xiaoyuyao commented on a change in pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#discussion_r428987504
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
##########
@@ -286,30 +301,45 @@ private void flushTransactions() {
}
}
- private void cleanupCache(List<Long> lastRatisTransactionIndex) {
- // As now only volume and bucket transactions are handled only called
- // cleanupCache on bucketTable.
- // TODO: After supporting all write operations we need to call
- // cleanupCache on the tables only when buffer has entries for that table.
- omMetadataManager.getBucketTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getVolumeTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getUserTable().cleanupCache(lastRatisTransactionIndex);
-
- //TODO: Optimization we can do here is for key transactions we can only
- // cleanup cache when it is key commit transaction. In this way all
- // intermediate transactions for a key will be read from in-memory cache.
- omMetadataManager.getOpenKeyTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getKeyTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getDeletedTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getS3Table().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getMultipartInfoTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getS3SecretTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getDelegationTokenTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getPrefixTable().cleanupCache(lastRatisTransactionIndex);
+ /**
+ * Set cleanup epoch for the DoubleBufferEntry.
+ * @param entry
+ * @param cleanupEpochs
+ */
+ private void setCleanupEpoch(DoubleBufferEntry entry, Map<String,
+ List<Long>> cleanupEpochs) {
+ // Add epochs depending on operated tables. In this way
+ // cleanup will be called only when required.
+
+ // As bucket and volume table is full cache add cleanup
+ // epochs only when request is delete to cleanup deleted
+ // entries.
+
+ String opName =
+ entry.getResponse().getOMResponse().getCmdType().name();
+
+ if (opName.toLowerCase().contains(VOLUME) ||
+ opName.toLowerCase().contains(BUCKET)) {
+ if (DeleteBucket.name().equals(opName)
+ || DeleteVolume.name().equals(opName)) {
+ entry.getResponse().operatedTables().forEach(
+ table -> cleanupEpochs.get(table)
+ .add(entry.getTrxLogIndex()));
+ }
+ } else {
+ entry.getResponse().operatedTables().forEach(
Review comment:
What are the difference is the operation is not volume bucket delete? It seems the txIndex are added the same anyway.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] bharatviswa504 commented on a change in pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
bharatviswa504 commented on a change in pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943#discussion_r446330484
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java
##########
@@ -353,29 +368,62 @@ private void flushTransactions() {
}
}
- private void cleanupCache(List<Long> lastRatisTransactionIndex) {
- // As now only volume and bucket transactions are handled only called
- // cleanupCache on bucketTable.
- // TODO: After supporting all write operations we need to call
- // cleanupCache on the tables only when buffer has entries for that table.
- omMetadataManager.getBucketTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getVolumeTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getUserTable().cleanupCache(lastRatisTransactionIndex);
-
- //TODO: Optimization we can do here is for key transactions we can only
- // cleanup cache when it is key commit transaction. In this way all
- // intermediate transactions for a key will be read from in-memory cache.
- omMetadataManager.getOpenKeyTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getKeyTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getDeletedTable().cleanupCache(lastRatisTransactionIndex);
- omMetadataManager.getMultipartInfoTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getS3SecretTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getDelegationTokenTable().cleanupCache(
- lastRatisTransactionIndex);
- omMetadataManager.getPrefixTable().cleanupCache(lastRatisTransactionIndex);
+ /**
+ * Set cleanup epoch for the DoubleBufferEntry.
+ * @param entry
+ * @param cleanupEpochs
+ */
+ private void setCleanupEpoch(DoubleBufferEntry entry, Map<String,
+ List<Long>> cleanupEpochs) {
+ // Add epochs depending on operated tables. In this way
+ // cleanup will be called only when required.
+
+ // As bucket and volume table is full cache add cleanup
+ // epochs only when request is delete to cleanup deleted
+ // entries.
+
+ String opName =
+ entry.getResponse().getOMResponse().getCmdType().name();
+
+ if (opName.toLowerCase().contains(VOLUME) ||
+ opName.toLowerCase().contains(BUCKET)) {
+ if (DeleteBucket.name().equals(opName)
+ || DeleteVolume.name().equals(opName)) {
+ addCleanupEntry(entry, cleanupEpochs);
+ }
+ } else {
+ addCleanupEntry(entry, cleanupEpochs);
+ }
+ }
+
+
+ private void addCleanupEntry(DoubleBufferEntry entry, Map<String,
+ List<Long>> cleanupEpochs) {
+ Class<? extends OMClientResponse> responseClass =
+ entry.getResponse().getClass();
+ CleanupTableInfo cleanupTableInfo =
+ responseClass.getAnnotation(CleanupTableInfo.class);
+ if (cleanupTableInfo != null) {
+ String[] cleanupTables = cleanupTableInfo.cleanupTables();
+ for (String table : cleanupTables) {
+ cleanupEpochs.computeIfAbsent(table, list -> new ArrayList<>())
+ .add(entry.getTrxLogIndex());
+ }
+ } else {
+ // This is to catch early errors, when an new response class missed to
+ // add CleanupTableInfo annotation.
+ throw new RuntimeException("CleanupTableInfo Annotation is missing " +
Review comment:
TestCleanupTableInfo test is added for this purpose.
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketDeleteResponse.java
##########
@@ -19,20 +19,29 @@
package org.apache.hadoop.ozone.om.response.bucket;
import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
import org.apache.hadoop.ozone.om.OMMetadataManager;
+import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.OMResponse;
import org.apache.hadoop.hdds.utils.db.BatchOperation;
import javax.annotation.Nonnull;
+import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.BUCKET_TABLE;
+
/**
* Response for DeleteBucket request.
*/
+@CleanupTableInfo(cleanupTables = {BUCKET_TABLE})
public final class OMBucketDeleteResponse extends OMClientResponse {
+ private static final List<String> OPERATED_TABLES =
Review comment:
Done
##########
File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/OMBucketSetPropertyResponse.java
##########
@@ -18,22 +18,31 @@
package org.apache.hadoop.ozone.om.response.bucket;
import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
+import org.apache.hadoop.ozone.om.response.CleanupTableInfo;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.OMResponse;
import org.apache.hadoop.hdds.utils.db.BatchOperation;
import javax.annotation.Nonnull;
+import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.BUCKET_TABLE;
+
/**
* Response for SetBucketProperty request.
*/
+@CleanupTableInfo(cleanupTables = {BUCKET_TABLE})
public class OMBucketSetPropertyResponse extends OMClientResponse {
private OmBucketInfo omBucketInfo;
+ private static final List<String> OPERATED_TABLES =
Review comment:
Done
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org
[GitHub] [hadoop-ozone] bharatviswa504 merged pull request #943: HDDS-3615. Call cleanup on tables only when double buffer has transactions related to tables.
Posted by GitBox <gi...@apache.org>.
bharatviswa504 merged pull request #943:
URL: https://github.com/apache/hadoop-ozone/pull/943
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: ozone-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: ozone-issues-help@hadoop.apache.org