ChristinaTech commented on code in PR #7198:
URL: https://github.com/apache/iceberg/pull/7198#discussion_r1157413800


##########
aws/src/main/java/org/apache/iceberg/aws/util/RetryDetector.java:
##########
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iceberg.aws.util;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import software.amazon.awssdk.core.metrics.CoreMetric;
+import software.amazon.awssdk.metrics.MetricCollection;
+import software.amazon.awssdk.metrics.MetricPublisher;
+
+/**
+ * Metrics are the only reliable way provided by the AWS SDK to determine if 
an API call was
+ * retried. This class can be attached to an AWS API call and checked after to 
determine if retries
+ * occurred.
+ */
+public class RetryDetector implements MetricPublisher {

Review Comment:
   So the main problem is this is used by both `GlueTableOperations` and 
`DynamoDbTableOperations` which are in different packages. Unfortunately, 
package-private visibility in Java does not make it visible to sub-packages. I 
originally attempted to hide this as much as possible given that limitation, as 
discussed 
[here](https://github.com/apache/iceberg/pull/7198#discussion_r1151191961), by 
both calling it `InternalRetryDetector` and hiding it inside of 
`AwsClientFactories`, but was asked not to do either of those.
   
   With those limitations in mind, the only other way to avoid making this 
public would be to make it a `protected` method of a superclass of 
`GlueTableOperations` and `DynamoDbTableOperations`. At present, their common 
superclass is `BaseMetastoreTableOperations` which is not part of the aws 
module. As a result, taking this approach would require creating an 
intermediate superclass that inherits from `BaseMetastoreTableOperations` which 
`GlueTableOperations` and `DynamoDbTableOperations` inherit from instead. This 
is too much additional complexity to work around a visibility concern.
   
   Unfortunately, the Iceberg project doesn't have a convention for declaring a 
public class as "not for public use" like Flink's `@Internal` annotation or 
Spark's `.internal.` package infix, so that wasn't an option.
   
   I am not going to change this for now due to lack of options, but am open to 
further suggestions in this comment chain.



-- 
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.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to