diff --git a/node/chunk_pool/src/mem_pool/chunk_pool_inner.rs b/node/chunk_pool/src/mem_pool/chunk_pool_inner.rs index c224c54..2efa644 100644 --- a/node/chunk_pool/src/mem_pool/chunk_pool_inner.rs +++ b/node/chunk_pool/src/mem_pool/chunk_pool_inner.rs @@ -336,15 +336,16 @@ impl MemoryChunkPool { Ok(()) } - pub async fn get_uploaded_seg_num(&self, root: &DataRoot) -> (usize, bool) { + pub async fn get_uploaded_seg_num(&self, root: &DataRoot) -> Option<(usize, bool)> { let inner = self.inner.lock().await; if let Some(file) = inner.segment_cache.get_file(root) { - (file.cached_chunk_num, true) - } else if let Some(file) = inner.write_control.get_file(root) { - (file.uploaded_seg_num(), false) + Some((file.segments.len(), true)) } else { - (0, false) + inner + .write_control + .get_file(root) + .map(|file| (file.uploaded_seg_num(), false)) } } } diff --git a/node/rpc/src/zgs/impl.rs b/node/rpc/src/zgs/impl.rs index 466e3d2..e29db8b 100644 --- a/node/rpc/src/zgs/impl.rs +++ b/node/rpc/src/zgs/impl.rs @@ -183,13 +183,28 @@ impl RpcServerImpl { } async fn get_file_info_by_tx(&self, tx: Transaction) -> RpcResult { - let (uploaded_seg_num, is_cached) = self + let finalized = self.ctx.log_store.check_tx_completed(tx.seq).await?; + let (uploaded_seg_num, is_cached) = match self .ctx .chunk_pool .get_uploaded_seg_num(&tx.data_merkle_root) - .await; - - let finalized = self.ctx.log_store.check_tx_completed(tx.seq).await?; + .await + { + Some(v) => v, + _ => ( + if finalized { + let chunks_per_segment = self.ctx.config.chunks_per_segment; + let (num_segments, _) = SegmentWithProof::split_file_into_segments( + tx.size as usize, + chunks_per_segment, + )?; + num_segments + } else { + 0 + }, + false, + ), + }; Ok(FileInfo { tx,