Skip to content

Commit c97510f

Browse files
authored
feat: add the CID to IPFS retry logs (#6144)
1 parent 90d21e4 commit c97510f

File tree

2 files changed

+85
-3
lines changed

2 files changed

+85
-3
lines changed

graph/src/ipfs/client.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub trait IpfsClient: Send + Sync + 'static {
3737
retry_policy: RetryPolicy,
3838
) -> IpfsResult<BoxStream<'static, IpfsResult<Bytes>>> {
3939
let fut = retry_policy
40-
.create("IPFS.cat_stream", self.logger())
40+
.create(format!("IPFS.cat_stream[{}]", path), self.logger())
4141
.no_timeout()
4242
.run({
4343
let path = path.to_owned();
@@ -67,7 +67,7 @@ pub trait IpfsClient: Send + Sync + 'static {
6767
retry_policy: RetryPolicy,
6868
) -> IpfsResult<Bytes> {
6969
let fut = retry_policy
70-
.create("IPFS.cat", self.logger())
70+
.create(format!("IPFS.cat[{}]", path), self.logger())
7171
.no_timeout()
7272
.run({
7373
let path = path.to_owned();
@@ -100,7 +100,7 @@ pub trait IpfsClient: Send + Sync + 'static {
100100
retry_policy: RetryPolicy,
101101
) -> IpfsResult<Bytes> {
102102
let fut = retry_policy
103-
.create("IPFS.get_block", self.logger())
103+
.create(format!("IPFS.get_block[{}]", path), self.logger())
104104
.no_timeout()
105105
.run({
106106
let path = path.to_owned();

graph/src/ipfs/gateway_client.rs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,4 +489,86 @@ mod tests {
489489

490490
assert_eq!(bytes.as_ref(), b"some data");
491491
}
492+
493+
#[tokio::test]
494+
async fn operation_names_include_cid_for_debugging() {
495+
use slog::{o, Drain, Logger, Record};
496+
use std::sync::{Arc, Mutex};
497+
498+
// Custom drain to capture log messages
499+
struct LogCapture {
500+
messages: Arc<Mutex<Vec<String>>>,
501+
}
502+
503+
impl Drain for LogCapture {
504+
type Ok = ();
505+
type Err = std::io::Error;
506+
507+
fn log(
508+
&self,
509+
record: &Record,
510+
_: &slog::OwnedKVList,
511+
) -> std::result::Result<Self::Ok, Self::Err> {
512+
let message = format!("{}", record.msg());
513+
self.messages.lock().unwrap().push(message);
514+
Ok(())
515+
}
516+
}
517+
518+
let captured_messages = Arc::new(Mutex::new(Vec::new()));
519+
let drain = LogCapture {
520+
messages: captured_messages.clone(),
521+
};
522+
let logger = Logger::root(drain.fuse(), o!());
523+
524+
let server = mock_server().await;
525+
let client = Arc::new(IpfsGatewayClient::new_unchecked(server.uri(), &logger).unwrap());
526+
527+
// Set up mock to fail twice then succeed to trigger retry with warning logs
528+
mock_get()
529+
.respond_with(ResponseTemplate::new(StatusCode::INTERNAL_SERVER_ERROR))
530+
.up_to_n_times(2)
531+
.expect(2)
532+
.mount(&server)
533+
.await;
534+
535+
mock_get()
536+
.respond_with(ResponseTemplate::new(StatusCode::OK).set_body_bytes(b"data"))
537+
.expect(1)
538+
.mount(&server)
539+
.await;
540+
541+
let path = make_path();
542+
543+
// This should trigger retry logs because we set up failures first
544+
let _result = client
545+
.cat(&path, usize::MAX, None, RetryPolicy::NonDeterministic)
546+
.await
547+
.unwrap();
548+
549+
// Check that the captured log messages include the CID
550+
let messages = captured_messages.lock().unwrap();
551+
let retry_messages: Vec<_> = messages
552+
.iter()
553+
.filter(|msg| msg.contains("Trying again after"))
554+
.collect();
555+
556+
assert!(
557+
!retry_messages.is_empty(),
558+
"Expected retry messages but found none. All messages: {:?}",
559+
*messages
560+
);
561+
562+
// Verify that the operation name includes the CID
563+
let expected_cid = "QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn";
564+
let has_cid_in_operation = retry_messages
565+
.iter()
566+
.any(|msg| msg.contains(&format!("IPFS.cat[{}]", expected_cid)));
567+
568+
assert!(
569+
has_cid_in_operation,
570+
"Expected operation name to include CID [{}] in retry messages: {:?}",
571+
expected_cid, retry_messages
572+
);
573+
}
492574
}

0 commit comments

Comments
 (0)