Skip to content

Commit 1f4e146

Browse files
pearlswanejeffrli
authored andcommitted
Handle ResourceNotFoundException from Dynamodb as AthenaConnectorException in DynamoDBRecordHandler
1 parent 116c7d1 commit 1f4e146

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

athena-dynamodb/src/main/java/com/amazonaws/athena/connectors/dynamodb/DynamoDBRecordHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import software.amazon.awssdk.services.dynamodb.model.ExecuteStatementResponse;
6363
import software.amazon.awssdk.services.dynamodb.model.QueryRequest;
6464
import software.amazon.awssdk.services.dynamodb.model.QueryResponse;
65+
import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;
6566
import software.amazon.awssdk.services.dynamodb.model.ScanRequest;
6667
import software.amazon.awssdk.services.dynamodb.model.ScanResponse;
6768
import software.amazon.awssdk.services.glue.model.ErrorDetails;
@@ -525,6 +526,9 @@ public Map<String, AttributeValue> next()
525526
catch (TimeoutException | ExecutionException e) {
526527
throw new AthenaConnectorException(e.getMessage(), ErrorDetails.builder().errorCode(FederationSourceErrorCode.OPERATION_TIMEOUT_EXCEPTION.toString()).build());
527528
}
529+
catch (ResourceNotFoundException e) {
530+
throw new AthenaConnectorException(e.getMessage(), ErrorDetails.builder().errorCode(FederationSourceErrorCode.ENTITY_NOT_FOUND_EXCEPTION.toString()).build());
531+
}
528532
currentPageIterator.set(iterator);
529533
if (iterator.hasNext()) {
530534
return iterator.next();

athena-dynamodb/src/test/java/com/amazonaws/athena/connectors/dynamodb/DynamoDBRecordHandlerTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.amazonaws.athena.connector.lambda.domain.predicate.QueryPlan;
3131
import com.amazonaws.athena.connector.lambda.domain.spill.S3SpillLocation;
3232
import com.amazonaws.athena.connector.lambda.domain.spill.SpillLocation;
33+
import com.amazonaws.athena.connector.lambda.exceptions.AthenaConnectorException;
3334
import com.amazonaws.athena.connector.lambda.metadata.GetTableRequest;
3435
import com.amazonaws.athena.connector.lambda.metadata.GetTableResponse;
3536
import com.amazonaws.athena.connector.lambda.metadata.glue.GlueFieldLexer;
@@ -49,6 +50,7 @@
4950
import org.apache.arrow.vector.util.JsonStringArrayList;
5051
import org.apache.arrow.vector.util.JsonStringHashMap;
5152
import org.junit.After;
53+
import org.junit.Assert;
5254
import org.junit.Before;
5355
import org.junit.Rule;
5456
import org.junit.Test;
@@ -64,6 +66,7 @@
6466
import software.amazon.awssdk.services.glue.GlueClient;
6567
import software.amazon.awssdk.services.glue.model.Column;
6668
import software.amazon.awssdk.services.glue.model.EntityNotFoundException;
69+
import software.amazon.awssdk.services.glue.model.FederationSourceErrorCode;
6770
import software.amazon.awssdk.services.glue.model.StorageDescriptor;
6871
import software.amazon.awssdk.services.glue.model.Table;
6972
import software.amazon.awssdk.services.s3.S3Client;
@@ -96,6 +99,7 @@
9699
import static com.amazonaws.services.dynamodbv2.document.ItemUtils.toAttributeValue;
97100
import static com.amazonaws.util.json.Jackson.toJsonString;
98101
import static org.junit.Assert.assertEquals;
102+
import static org.junit.Assert.assertThrows;
99103
import static org.junit.Assert.assertTrue;
100104
import static org.mockito.ArgumentMatchers.any;
101105
import static org.mockito.Mockito.mock;
@@ -964,6 +968,33 @@ public void testNumStructWithSchemaFromGlueTable() throws Exception
964968
assertEquals(numMapReader.reader("key2").readInteger(), (Integer) 2);
965969
}
966970

971+
@Test
972+
public void testResourceNotFoundExceptionHandling() throws Exception
973+
{
974+
Split split = Split.newBuilder(SPILL_LOCATION, keyFactory.create())
975+
.add(TABLE_METADATA, "nonexistent_table")
976+
.add(SEGMENT_ID_PROPERTY, "0")
977+
.add(SEGMENT_COUNT_METADATA, "1")
978+
.build();
979+
980+
ReadRecordsRequest request = new ReadRecordsRequest(
981+
TEST_IDENTITY,
982+
TEST_CATALOG_NAME,
983+
TEST_QUERY_ID,
984+
new TableName(DEFAULT_SCHEMA, "nonexistent_table"),
985+
schema,
986+
split,
987+
new Constraints(Collections.emptyMap(), Collections.emptyList(), Collections.emptyList(), DEFAULT_NO_LIMIT, Collections.emptyMap(), null),
988+
100_000_000_000L,
989+
100_000_000_000L);
990+
991+
AthenaConnectorException exception = assertThrows(AthenaConnectorException.class, () -> {
992+
handler.doReadRecords(allocator, request);
993+
});
994+
Assert.assertEquals(FederationSourceErrorCode.ENTITY_NOT_FOUND_EXCEPTION.toString(),
995+
exception.getErrorDetails().errorCode());
996+
}
997+
967998
private long getPackedDateTimeWithZone(String s)
968999
{
9691000
ZonedDateTime zdt = ZonedDateTime.parse(s);

0 commit comments

Comments
 (0)