Skip to content

Leaking doc handles #77

@audkar

Description

@audkar

Problem:

Iroh docs stop responding/returning value on some devices (low end Android phones).

I can reliably reproduce by having such code repeated a lot of times:

        let status = docs
            .open(doc_id)
            .await
            .unwrap()
            .unwrap()
            .status()
            .await
            .unwrap();

after n attempts this stops returning values and hangs suspended.


I see suspiciously growing handles count on a Document Status. Should this be continuously increasing counter?

Full suspicious code block

Here's some explanatory text before the code.

    #[tokio::test]
    async fn test_app() {
        let secret_key = { SecretKey::generate(&mut rand::rng()) };
        let endpoint = Endpoint::empty_builder(RelayMode::Disabled)
            .secret_key(secret_key)
            .bind()
            .await
            .unwrap();
        let mdns = MdnsDiscovery::builder().build(endpoint.id()).unwrap();
        endpoint.discovery().add(mdns.clone());

        let pinger = iroh_ping::Ping::new();
        let blobs_store = MemStore::new();
        let gossip = Gossip::builder().spawn(endpoint.clone());
        let docs = Docs::memory()
            .spawn(endpoint.clone(), (*blobs_store).clone(), gossip.clone())
            .await
            .unwrap();

        let _router = Router::builder(endpoint.clone())
            .accept(iroh_ping::ALPN, pinger.clone())
            .accept(iroh_blobs::ALPN, BlobsProtocol::new(&blobs_store, None))
            .accept(iroh_gossip::ALPN, gossip.clone())
            .accept(iroh_docs::ALPN, docs.clone())
            .spawn();

        let doc_id = docs.create().await.unwrap().id();

        for _ in 0..100 {
            let doc = docs.open(doc_id).await.unwrap().unwrap(); // Does this leak the memory even if the resource is dropped?
            // doc.close().await.unwrap(); 
        }

        let status = docs
            .open(doc_id)
            .await
            .unwrap()
            .unwrap()
            .status()
            .await
            .unwrap();

        assert_eq!(1, status.handles);
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions