apache / apache/servicecomb-java-chassis

[BUG] - 使用iputstreanpart发送文件偶现服务端超时

Aperta
#4,913 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
bug
Lingua principale
Java
Stelle
1.9k
Fork
814
Merge medio
8g 23h
PR unite (30g)
1

Descrizione

## Steps to Reproduce
服务端报错;
Image

Image

Image

2025-08-27 08:43:58.866 [transport-vert.x-eventloop-thread-6] ERROR - [PumpFromPart.java:lambda$toWriteStream$1:75] - [] - to write stream failed. java.util.concurrent.CompletionException: io.vertx.core.http.HttpClosedException: Connection was closed
at java.base/java.util.concurrent.CompletableFuture.encodeRelay(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.completeRelay(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$UniRelay$tryFire.run(Unknown Source)

客户端报错:
Image

超时配置
rest:
address: 0.0.0.0:8183?sslEnabled=true
client:
thread-count: 8
maxWaitQueueSize: 100000
connection:
maxPoolSize: 10
timeoutInMillis: 5000
keepAliveTimeoutInSeconds: 15
idleTimeoutInSeconds: 50
keepAlive: true
server:
thread-count: 8
compression: false
maxHeaderSize: 8192
timeout: 3000
maxFormAttributeSize: -1
connection:
idleTimeoutInSeconds: 60
服务端代码;
` @RequestMapping(value = "/v1", method = RequestMethod.POST)
public ResponseEntity syncCache(@RequestBody String param) throws Exception {
return ResponseEntity
.ok()
.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE)
.header("result", JSON.toJSONString(result))
.body(new InputStreamPart(null, sendFile != null ? Files.newInputStream(sendFile) : new ByteArrayInputStream(new byte[0]))
.setSubmittedFileName("data.dat"));
}`
客户端代码
` ResponseEntity response = REST_TEMPLATE.postForEntity("cse://xxxx", body, ReadStreamPart.class);
try {
body.saveToFile(tempDataFile.toFile(), new OpenOptions().setCreateNew(true)).get(30, TimeUnit.SECONDS);
} catch (Exception e) {
Files.deleteIfExists(tempDataFile);
throw e;
}`

发送的文件大小不超过4M,内网万兆带宽网络稳定,排除网络问题,万分之1概率出现文件拉取超时, 辛苦帮忙看一下是使用的问题还是存在竞态问题,文件是在server另外的定时任务定时刷新,创建tmp文件后原子重命名方式,原理上不会影响文件下载。

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

Inizia dalla riga 75 di PumpFromPart.java e segui la risposta del server InputStreamPart attraverso il percorso saveToFile di salvataggio del client ReadStreamPart. Utilizza gli snippet del server e del client forniti, il comportamento dell’aggiornamento dei file e le impostazioni di timeout per indagare sulla chiusura intermittente della connessione. Il lavoro è completo quando viene determinato se il fallimento è causato dall’utilizzo o da una race condition e la causa confermata viene registrata o risolta.

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

Valutazione

Stack tecnologico
java
Ambito
api, backend, networking
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Da chiarire
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.