{"record":{"id":"1cfd3178b7ef7d36","repo":"diem/diem","slug":"memorylistener-unknown-error","errorCode":null,"errorMessage":"MemoryListener unknown error","messagePattern":"MemoryListener unknown error","errorType":"error_code","errorClass":"io::Error","httpStatus":null,"severity":"error","filePath":"network/memsocket/src/lib.rs","lineNumber":187,"sourceCode":"    /// while let Some(stream) = incoming.next().await {\n    ///     match stream {\n    ///         Ok(stream) => {\n    ///             println!(\"new connection!\");\n    ///         },\n    ///         Err(e) => { /* connection failed */ }\n    ///     }\n    /// }\n    /// # Ok(())}\n    /// ```\n    pub fn incoming(&mut self) -> Incoming<'_> {\n        Incoming { inner: self }\n    }\n\n    fn poll_accept(&mut self, context: &mut Context) -> Poll<Result<MemorySocket>> {\n        match Pin::new(&mut self.incoming).poll_next(context) {\n            Poll::Ready(Some(socket)) => Poll::Ready(Ok(socket)),\n            Poll::Ready(None) => {\n                let err = Error::new(ErrorKind::Other, \"MemoryListener unknown error\");\n                Poll::Ready(Err(err))\n            }\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\n/// Stream returned by the `MemoryListener::incoming` function representing the\n/// stream of sockets received from a listener.\n#[must_use = \"streams do nothing unless polled\"]\n#[derive(Debug)]\npub struct Incoming<'a> {\n    inner: &'a mut MemoryListener,\n}\n\nimpl<'a> Stream for Incoming<'a> {\n    type Item = Result<MemorySocket>;\n","sourceCodeStart":169,"sourceCodeEnd":205,"githubUrl":"https://github.com/diem/diem/blob/fc4714a8ea273b6efe8b13dbce72ea60aad9a16c/network/memsocket/src/lib.rs#L169-L205","documentation":"MemoryListener (the in-memory socket listener used by memsocket for tests/simulations) is backed by a stream of incoming connections. When that stream is closed and returns None — i.e. the listener was dropped or the socket registry shut down — poll_accept converts the termination into an io::Error with this message, since std's Listener API has no graceful 'closed' signal.","triggerScenarios":"Calling accept() on a MemoryListener whose underlying incoming stream has ended: the MemorySocket listener was dropped, the shared incoming channel was closed, or the memsocket registry shut down while a task was still accepting.","commonSituations":"Async test harness drops the socket registry or listener while a server task is still polling accept; simulation code that closes listeners without first stopping accept loops; shutdown-ordering races in tests using network builders built on memsocket.","solutions":["Ensure the accept loop is stopped/dropped before the MemoryListener or registry is torn down","Hold a clone of the listener/registry for the lifetime of the accept task","Treat this error as 'listener closed' and exit the accept loop instead of retrying","If seen in tests, fix shutdown ordering (abort server tasks before dropping sockets)"],"exampleFix":"// before\nloop { let conn = listener.accept().await?; spawn(handle(conn)); }\n// after\nloop {\n    match listener.accept().await {\n        Ok(conn) => spawn(handle(conn)),\n        Err(e) if e.kind() == ErrorKind::Other && e.to_string().contains(\"MemoryListener unknown error\") => break, // listener closed\n        Err(e) => return Err(e.into()),\n    }\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// treat the error as listener-closed and stop accepting\nmatch listener.accept().await {\n    Ok(socket) => /* handle */ ,\n    Err(e) if e.to_string().contains(\"MemoryListener unknown error\") => break,\n    Err(e) => return Err(e.into()),\n}","preventionTips":["Drop MemoryListeners only after their accept tasks are stopped","Keep the memsocket registry alive for the full test lifetime","Check shutdown ordering in test teardown (abort tasks before dropping sockets)","Map this error explicitly in code that reuses memsocket for simulations"],"tags":["network","memsocket","in-memory","async","io-error"],"backgroundTag":"listener-closed-unexpectedly","analyzedSha":"fc4714a8ea273b6efe8b13dbce72ea60aad9a16c","analyzedAt":"2026-09-04T21:07:05.890Z","contentChangedAt":"2026-09-04T21:07:05.890Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}