@@ -7,7 +7,9 @@ import com.intellij.openapi.Disposable
77import com.intellij.openapi.application.runInEdt
88import com.intellij.serviceContainer.AlreadyDisposedException
99import com.intellij.util.io.HttpRequests
10+ import kotlinx.coroutines.Dispatchers
1011import kotlinx.coroutines.delay
12+ import kotlinx.coroutines.withContext
1113import org.apache.commons.codec.digest.DigestUtils
1214import software.amazon.awssdk.core.exception.SdkClientException
1315import software.amazon.awssdk.services.codewhispererruntime.model.ResumeTransformationResponse
@@ -20,6 +22,7 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Transformation
2022import software.amazon.awssdk.services.codewhispererruntime.model.TransformationUserActionStatus
2123import software.amazon.awssdk.services.codewhispererstreaming.model.TransformationDownloadArtifactType
2224import software.amazon.awssdk.services.ssooidc.model.SsoOidcException
25+ import software.aws.toolkits.core.utils.Waiters.waitUntil
2326import software.aws.toolkits.core.utils.error
2427import software.aws.toolkits.core.utils.exists
2528import software.aws.toolkits.core.utils.getLogger
@@ -55,13 +58,14 @@ import java.io.File
5558import java.io.FileInputStream
5659import java.io.IOException
5760import java.net.ConnectException
61+ import java.net.SocketTimeoutException
62+ import java.net.UnknownHostException
5863import java.nio.file.Path
5964import java.time.Instant
6065import java.util.Base64
6166import java.util.concurrent.CancellationException
6267import java.util.concurrent.atomic.AtomicBoolean
6368import javax.net.ssl.SSLHandshakeException
64- import kotlin.math.pow
6569
6670const val MAX_ZIP_SIZE = 2000000000 // 2GB
6771const val EXPLAINABILITY_V1 = " EXPLAINABILITY_V1"
@@ -143,7 +147,7 @@ class CodeModernizerSession(
143147 *
144148 * Based on [CodeWhispererCodeScanSession]
145149 */
146- fun createModernizationJob (copyResult : MavenCopyCommandsResult ? ): CodeModernizerStartJobResult {
150+ suspend fun createModernizationJob (copyResult : MavenCopyCommandsResult ? ): CodeModernizerStartJobResult {
147151 LOG .info { " Compressing local project" }
148152 val payload: File ?
149153 var payloadSize = 0
@@ -378,8 +382,10 @@ class CodeModernizerSession(
378382 /* *
379383 * Adapted from [CodeWhispererCodeScanSession]
380384 */
381- fun uploadPayload (payload : File ): String {
382- val sha256checksum: String = Base64 .getEncoder().encodeToString(DigestUtils .sha256(FileInputStream (payload)))
385+ suspend fun uploadPayload (payload : File ): String {
386+ val sha256checksum: String = Base64 .getEncoder().encodeToString(withContext(Dispatchers .IO ) {
387+ DigestUtils .sha256(FileInputStream (payload))
388+ })
383389 if (isDisposed.get()) {
384390 throw AlreadyDisposedException (" Disposed when about to create upload URL" )
385391 }
@@ -395,22 +401,21 @@ class CodeModernizerSession(
395401 throw AlreadyDisposedException (" Disposed when about to upload project artifact to s3" )
396402 }
397403 val uploadStartTime = Instant .now()
398- for (i in 0 .. 2 ) {
399- try {
400- clientAdaptor.uploadArtifactToS3(
401- createUploadUrlResponse.uploadUrl(),
402- payload,
403- sha256checksum,
404- createUploadUrlResponse.kmsKeyArn().orEmpty(),
405- ) { shouldStop.get() }
406- break
407- } catch (e: Exception ) {
408- LOG .error { " Unexpected error when uploading project artifact to S3 on attempt ${i + 1 } /3: ${e.localizedMessage} " }
409- if (i == 2 ) {
410- throw e
411- }
412- Thread .sleep((1000 * 2.0 .pow(i)).toLong())
413- }
404+ waitUntil (
405+ exceptionsToIgnore = setOf (
406+ UnknownHostException ::class ,
407+ SocketTimeoutException ::class ,
408+ HttpRequests .HttpStatusException ::class ,
409+ ConnectException ::class
410+ )
411+ )
412+ {
413+ clientAdaptor.uploadArtifactToS3(
414+ createUploadUrlResponse.uploadUrl(),
415+ payload,
416+ sha256checksum,
417+ createUploadUrlResponse.kmsKeyArn().orEmpty(),
418+ ) { shouldStop.get() }
414419 }
415420 LOG .info { " Upload to S3 succeeded" }
416421 if (! shouldStop.get()) {
0 commit comments