aws / aws/aws-sdk-java-v2

Doing blocking calls from DynamoDbEnhancedClientExtension methods

Aperta
#2,996 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub
dynamodb-enhanced feature-request p3
Lingua principale
Java
Stelle
2.6k
Fork
1k
Merge medio
2g 9h
PR unite (30g)
51

Descrizione

### Describe the issue

Hello,

The `afterRead` and `beforeWrite` methods are synchronous in nature.
Either they return an object of WriteModification or ReadModification, not a Future of those.
So if we need to perform a blocking call, then the thread will be blocked.

Thanks!

### Steps to Reproduce

Create a new implementation of DynamoDbEnhancedClientExtension, similar to:
```
public class BlockingDynamoDbEnhancedClientExtension implements DynamoDbEnhancedClientExtension
{
@Override
public WriteModification beforeWrite(DynamoDbExtensionContext.BeforeWrite context)
{
AwsCrypto crypto = AwsCrypto.builder()
.withCommitmentPolicy(CommitmentPolicy.ForbidEncryptAllowDecrypt)
.build();
// pseudo-code
// encrypt something from the context
byte[] result = crypto.encryptData(cryptoMaterialsManager, plainBytes)
.getResult();

return DynamoDbEnhancedClientExtension.super.beforeWrite(context);
}
}
```

The call to `encryptData` blocks the thread as it makes a request to the AWS KMS service.

### Current behavior

I use https://github.com/reactor/BlockHound in my project to track blocking calls:

```

reactor.blockhound.BlockingOperationError: Blocking call! java.net.Socket$SocketInputStream#read
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
Suppressed: reactor.blockhound.BlockingOperationError: Blocking call! java.net.Socket$SocketInputStream#read
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1455)
at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1059)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
at org.apache.http.impl.BHttpConnectionBase.fillInputBuffer(BHttpConnectionBase.java:342)
at org.apache.http.impl.BHttpConnectionBase.isStale(BHttpConnectionBase.java:362)
at org.apache.http.impl.conn.CPool.validate(CPool.java:71)
at org.apache.http.impl.conn.CPool.validate(CPool.java:45)
at org.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:256)
at org.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:198)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:306)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:282)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at com.amazonaws.http.conn.ClientConnectionRequestFactory$Handler.invoke(ClientConnectionRequestFactory.java:70)
at com.amazonaws.http.conn.$Proxy124.get(Unknown Source)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1331)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1145)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:802)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:770)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:744)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:704)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:686)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:550)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:530)
at com.amazonaws.services.kms.AWSKMSClient.doInvoke(AWSKMSClient.java:7223)
at com.amazonaws.services.kms.AWSKMSClient.invoke(AWSKMSClient.java:7190)
at com.amazonaws.services.kms.AWSKMSClient.invoke(AWSKMSClient.java:7179)
at com.amazonaws.services.kms.AWSKMSClient.executeGenerateDataKey(AWSKMSClient.java:3482)
at com.amazonaws.services.kms.AWSKMSClient.generateDataKey(AWSKMSClient.java:3451)
at com.amazonaws.encryptionsdk.kms.KmsMasterKey.generateDataKey(KmsMasterKey.java:105)
at com.amazonaws.encryptionsdk.DefaultCryptoMaterialsManager.getMaterialsForEncrypt(DefaultCryptoMaterialsManager.java:91)
at com.amazonaws.encryptionsdk.caching.CachingCryptoMaterialsManager.getMaterialsForEncrypt(CachingCryptoMaterialsManager.java:298)
at com.amazonaws.encryptionsdk.AwsCrypto.encryptData(AwsCrypto.java:334)
at com.amazonaws.encryptionsdk.AwsCrypto.encryptData(AwsCrypto.java:365)
```

### AWS Java SDK version used

2.17.115

### JDK version used

openjdk version "11.0.2" 2019-01-15 OpenJDK Runtime Environment 18.9 (build 11.0.2+9) OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

### Operating System and version

macOS

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia dall’interfaccia DynamoDbEnhancedClientExtension e ispeziona i callback afterRead e beforeWrite, quindi traccia il modo in cui il client avanzato li invoca. Confronta questo percorso con l’errore di BlockHound segnalato durante la crittografia AWS KMS; il problema è risolto solo quando il trattamento del lavoro bloccante è definito e verificato, ma non viene indicato alcun file sorgente né alcun test.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
aws, java
Ambito
backend-api-design, databases
Tipo di issue
Funzionalità
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Ferma
Chiarezza
Da chiarire
Idoneità per principianti
25/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.