)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"change_message_id":"543471d6cbb06e489df6d48bcf132d4dc86ef3a2","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"17b46edb_fcc5f274","updated":"2023-09-20 10:35:23.000000000","message":"The tests still seem to be broken, this time I get timeouts:\n\n```\nrunning 21 tests\ntest fs::tests::mount ... ok\ntest fs::tests::disallow_writes ... ok\ntest fs::tests::check_attributes has been running for over 60 seconds\ntest fs::tests::compare_inodes_directories has been running for over 60 seconds\ntest fs::tests::compare_inodes_files has been running for over 60 seconds\ntest fs::tests::compare_inodes_symlinks has been running for over 60 seconds\ntest fs::tests::missing_blob has been running for over 60 seconds\ntest fs::tests::missing_directory has been running for over 60 seconds\ntest fs::tests::read_blob_deep_inside_dir has been running for over 60 seconds\ntest fs::tests::read_blob_inside_dir has been running for over 60 seconds\ntest fs::tests::read_file_at_root has been running for over 60 seconds\ntest fs::tests::read_large_file_at_root has been running for over 60 seconds\ntest fs::tests::read_stat_directory has been running for over 60 seconds\ntest fs::tests::read_stat_through_symlink has been running for over 60 seconds\n```","commit_id":"4bd104771e20ca9f6d316bfdbb0a2d5d069a0562"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"fa2d9986ea22003149b502bf03f3c116c1220f8a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"75aa49a7_5788a9e8","in_reply_to":"17b46edb_fcc5f274","updated":"2023-09-20 11:57:21.000000000","message":"tests should be passing again","commit_id":"4bd104771e20ca9f6d316bfdbb0a2d5d069a0562"}],"tvix/store/Cargo.toml":[{"author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"change_message_id":"881b1ed1f0e1c3aebb86dec9665bb5916363457f","unresolved":true,"context_lines":[{"line_number":31,"context_line":"url \u003d \"2.4.0\""},{"line_number":32,"context_line":"pin-project-lite \u003d \"0.2.13\""},{"line_number":33,"context_line":"const-zero \u003d \"0.1.1\""},{"line_number":34,"context_line":"parking_lot \u003d { version \u003d \"0.12.1\" }"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[dependencies.fuse-backend-rs]"},{"line_number":37,"context_line":"optional \u003d true"}],"source_content_type":"text/x-toml","patch_set":8,"id":"cd720787_f5615416","line":34,"updated":"2023-09-18 11:15:14.000000000","message":"We also are using RwLock from `std::sync` (as an Arc\u003cRwLock\u003c…\u003e\u003e) in the in-memory implementations.\n\nI\u0027m not opposed to be using the one from parking_lot, but we should probably also update these implementations to use the same.","commit_id":"66117a13921321ada5a8b6555046c8ab7efd21bd"},{"author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"change_message_id":"292d9f5c8a33e7ba9e029daa19009adfcd24966b","unresolved":true,"context_lines":[{"line_number":31,"context_line":"url \u003d \"2.4.0\""},{"line_number":32,"context_line":"pin-project-lite \u003d \"0.2.13\""},{"line_number":33,"context_line":"const-zero \u003d \"0.1.1\""},{"line_number":34,"context_line":"parking_lot \u003d { version \u003d \"0.12.1\" }"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[dependencies.fuse-backend-rs]"},{"line_number":37,"context_line":"optional \u003d true"}],"source_content_type":"text/x-toml","patch_set":8,"id":"b55def0a_b77eff81","line":34,"in_reply_to":"0c122b28_8d3b1b79","updated":"2023-09-18 14:03:58.000000000","message":"SGTM!","commit_id":"66117a13921321ada5a8b6555046c8ab7efd21bd"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"e8562fba1a9dc906bb5e412dff3b05a14452b344","unresolved":false,"context_lines":[{"line_number":31,"context_line":"url \u003d \"2.4.0\""},{"line_number":32,"context_line":"pin-project-lite \u003d \"0.2.13\""},{"line_number":33,"context_line":"const-zero \u003d \"0.1.1\""},{"line_number":34,"context_line":"parking_lot \u003d { version \u003d \"0.12.1\" }"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[dependencies.fuse-backend-rs]"},{"line_number":37,"context_line":"optional \u003d true"}],"source_content_type":"text/x-toml","patch_set":8,"id":"325365ac_98d3a3c1","line":34,"in_reply_to":"b55def0a_b77eff81","updated":"2023-09-19 17:15:12.000000000","message":"I\u0027ll probably do this as a followup to keep this cl from growing any more, if that is alright.","commit_id":"66117a13921321ada5a8b6555046c8ab7efd21bd"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"1aa4da0b534149632aff61fceacf32ee3c41f678","unresolved":true,"context_lines":[{"line_number":31,"context_line":"url \u003d \"2.4.0\""},{"line_number":32,"context_line":"pin-project-lite \u003d \"0.2.13\""},{"line_number":33,"context_line":"const-zero \u003d \"0.1.1\""},{"line_number":34,"context_line":"parking_lot \u003d { version \u003d \"0.12.1\" }"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"[dependencies.fuse-backend-rs]"},{"line_number":37,"context_line":"optional \u003d true"}],"source_content_type":"text/x-toml","patch_set":8,"id":"0c122b28_8d3b1b79","line":34,"in_reply_to":"cd720787_f5615416","updated":"2023-09-18 13:58:35.000000000","message":"Sounds good, I typically prefer parking_lot over std, so if you\u0027re okay with it as well I can switch the in-mem impl.","commit_id":"66117a13921321ada5a8b6555046c8ab7efd21bd"}],"tvix/store/src/fuse/mod.rs":[{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"4a6c4b3122e9b6c8dda526578a5f28d91e2a6127","unresolved":true,"context_lines":[{"line_number":86,"context_line":"    inode_tracker: RwLock\u003cInodeTracker\u003e,"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    /// This holds all open file handles"},{"line_number":89,"context_line":"    file_handles: RwLock\u003cHashMap\u003cu64, tokio::sync::Mutex\u003cBox\u003cdyn BlobReader\u003e\u003e\u003e\u003e,"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    next_file_handle: AtomicU64,"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rustsrc","patch_set":7,"id":"9f8bc439_e4fdc15c","line":89,"updated":"2023-09-17 13:29:48.000000000","message":"The extra Mutex is quite annoying here, I added it so `FUSE` is `Sync` which is required for `fuse-backend-rs` since it spawns multiple threads.\n\nI tried doing `Box\u003cdyn BlobReader + Send Sync\u003e` but the `NaiveSeeker` contains some `tonic`/proto types which are not `Sync`.\n\nOpen to ideas","commit_id":"7b3fefb356400298c8977e9879db2bd2685f1d98"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"1aa4da0b534149632aff61fceacf32ee3c41f678","unresolved":true,"context_lines":[{"line_number":86,"context_line":"    inode_tracker: RwLock\u003cInodeTracker\u003e,"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    /// This holds all open file handles"},{"line_number":89,"context_line":"    file_handles: RwLock\u003cHashMap\u003cu64, tokio::sync::Mutex\u003cBox\u003cdyn BlobReader\u003e\u003e\u003e\u003e,"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    next_file_handle: AtomicU64,"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rustsrc","patch_set":7,"id":"51856966_0db9e5a4","line":89,"in_reply_to":"2460ac5a_fa4ef611","updated":"2023-09-18 13:58:35.000000000","message":"After some mulling, I think this sort of makes sense to do the lock here, a `BlobReader` right now is definitely not thread-safe. I think this will be a non-issue once we have the new reader which issues `read_at`-type RPCs, which will then be safe for concurrent use.\n\nOne way we could make the critical sections smaller without much effort is to wrap the `Mutex` in an `Arc`. That way all we need to do when reading is to get the `file_handle` out `file_handles` (read lock), clone the `Arc` and then let go of `file_handles`. Then we use the `Mutex` to prevent concurrent reads on the same file handle/`BlobReader`.","commit_id":"7b3fefb356400298c8977e9879db2bd2685f1d98"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"e8562fba1a9dc906bb5e412dff3b05a14452b344","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    inode_tracker: RwLock\u003cInodeTracker\u003e,"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    /// This holds all open file handles"},{"line_number":89,"context_line":"    file_handles: RwLock\u003cHashMap\u003cu64, tokio::sync::Mutex\u003cBox\u003cdyn BlobReader\u003e\u003e\u003e\u003e,"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    next_file_handle: AtomicU64,"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rustsrc","patch_set":7,"id":"e9f9b4fe_910f9376","line":89,"in_reply_to":"34618092_aae7b3ff","updated":"2023-09-19 17:15:12.000000000","message":"Decided to go the `Arc\u003cMutex\u003c..\u003e\u003e` route, that way we can do concurrent reads of different file handles.\n\nDefinitely room to improve on the concurrency front, but we can do those as followups.","commit_id":"7b3fefb356400298c8977e9879db2bd2685f1d98"},{"author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"change_message_id":"292d9f5c8a33e7ba9e029daa19009adfcd24966b","unresolved":true,"context_lines":[{"line_number":86,"context_line":"    inode_tracker: RwLock\u003cInodeTracker\u003e,"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    /// This holds all open file handles"},{"line_number":89,"context_line":"    file_handles: RwLock\u003cHashMap\u003cu64, tokio::sync::Mutex\u003cBox\u003cdyn BlobReader\u003e\u003e\u003e\u003e,"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    next_file_handle: AtomicU64,"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rustsrc","patch_set":7,"id":"34618092_aae7b3ff","line":89,"in_reply_to":"51856966_0db9e5a4","updated":"2023-09-18 14:03:58.000000000","message":"Ok!","commit_id":"7b3fefb356400298c8977e9879db2bd2685f1d98"},{"author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"change_message_id":"881b1ed1f0e1c3aebb86dec9665bb5916363457f","unresolved":true,"context_lines":[{"line_number":86,"context_line":"    inode_tracker: RwLock\u003cInodeTracker\u003e,"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    /// This holds all open file handles"},{"line_number":89,"context_line":"    file_handles: RwLock\u003cHashMap\u003cu64, tokio::sync::Mutex\u003cBox\u003cdyn BlobReader\u003e\u003e\u003e\u003e,"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    next_file_handle: AtomicU64,"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rustsrc","patch_set":7,"id":"2460ac5a_fa4ef611","line":89,"in_reply_to":"9f8bc439_e4fdc15c","updated":"2023-09-18 11:15:14.000000000","message":"Can we push this problem further down, make all `BlobReader` `Sync` and wrap the inner reader(s) in a Mutex? Not sure it\u0027d make much of a difference.\n\nIn any case, ensuring the hashmap is usable in a more concurrent fashion, or making sure we keep these exclusive locks as short as possible probably is gonna make more of a difference.","commit_id":"7b3fefb356400298c8977e9879db2bd2685f1d98"},{"author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"change_message_id":"61664e8162ce0123d0565fbac9ba84ae8b3aa4d9","unresolved":true,"context_lines":[{"line_number":177,"context_line":"                        let ino \u003d inode_tracker.put((\u0026root_node).into());"},{"line_number":178,"context_line":"                        (ino, inode_tracker.get(ino).unwrap())"},{"line_number":179,"context_line":"                    };"},{"line_number":180,"context_line":"                    store_paths.insert(store_path, ino);"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"                    Ok(Some((ino, inode)))"},{"line_number":183,"context_line":"                }"}],"source_content_type":"text/x-rustsrc","patch_set":10,"id":"5f745066_cc29c0ab","line":180,"updated":"2023-09-19 18:51:15.000000000","message":"can we only try to get a write-able version here, rather than for the whole function? (and maybe check another time noone else populated that StorePath in the meantime).\n\nDue to PathinfoSevice not being asyncified yet we don\u0027t quite see if, but we fetch a Pathinfo in L158, which can take a significant amount of time, during which everything else accessing self.store_paths will have to wait.","commit_id":"1aa1cafcdeb52772f6a311b0848375071d371299"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"98cae9c45f8473ca91dc795e7634afa0ea7b9291","unresolved":false,"context_lines":[{"line_number":177,"context_line":"                        let ino \u003d inode_tracker.put((\u0026root_node).into());"},{"line_number":178,"context_line":"                        (ino, inode_tracker.get(ino).unwrap())"},{"line_number":179,"context_line":"                    };"},{"line_number":180,"context_line":"                    store_paths.insert(store_path, ino);"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"                    Ok(Some((ino, inode)))"},{"line_number":183,"context_line":"                }"}],"source_content_type":"text/x-rustsrc","patch_set":10,"id":"cabd6f49_efe277c7","line":180,"in_reply_to":"2c87624f_59aebde0","updated":"2023-09-19 19:14:36.000000000","message":"Going with your suggestion for now: limit the write lock to this section and checking if someone else beat us to updating the inode tracker/store path map.","commit_id":"1aa1cafcdeb52772f6a311b0848375071d371299"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"f70ae1426c04f588ed5c0b0a6dfefe017ea708b4","unresolved":true,"context_lines":[{"line_number":177,"context_line":"                        let ino \u003d inode_tracker.put((\u0026root_node).into());"},{"line_number":178,"context_line":"                        (ino, inode_tracker.get(ino).unwrap())"},{"line_number":179,"context_line":"                    };"},{"line_number":180,"context_line":"                    store_paths.insert(store_path, ino);"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"                    Ok(Some((ino, inode)))"},{"line_number":183,"context_line":"                }"}],"source_content_type":"text/x-rustsrc","patch_set":10,"id":"2c87624f_59aebde0","line":180,"in_reply_to":"5f745066_cc29c0ab","updated":"2023-09-19 18:59:19.000000000","message":"Good point. Sounds like we need some sort of mechanism to coalesce concurrent lookups for the same store paths. Maybe we throw in another `Mutex` in the `StorePath` values. That way we can use the inner `Mutex` to prevent concurrent lookups of the same store path while allowing other store paths to be accessed?","commit_id":"1aa1cafcdeb52772f6a311b0848375071d371299"},{"author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"change_message_id":"8676ec4e6b6a756d8219bee986023e38b3cd4bec","unresolved":true,"context_lines":[{"line_number":144,"context_line":"        };"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        let ino \u003d {"},{"line_number":147,"context_line":"            // This extra scope makes sure we drop the read lock to pevent any deadlocks."},{"line_number":148,"context_line":"            let store_paths \u003d self.store_paths.read();"},{"line_number":149,"context_line":"            store_paths.get(\u0026store_path).cloned()"},{"line_number":150,"context_line":"        };"}],"source_content_type":"text/x-rustsrc","patch_set":12,"id":"7c9d2b15_d60d1ba8","line":147,"updated":"2023-09-20 11:47:04.000000000","message":"s/pevent/prevent/\n\n… make sure we drop the read lock immediately after reading, to prevent deadlocks.","commit_id":"dc7ea641fde9a87f9701324edc833483ce37500a"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"fa2d9986ea22003149b502bf03f3c116c1220f8a","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        };"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        let ino \u003d {"},{"line_number":147,"context_line":"            // This extra scope makes sure we drop the read lock to pevent any deadlocks."},{"line_number":148,"context_line":"            let store_paths \u003d self.store_paths.read();"},{"line_number":149,"context_line":"            store_paths.get(\u0026store_path).cloned()"},{"line_number":150,"context_line":"        };"}],"source_content_type":"text/x-rustsrc","patch_set":12,"id":"83895090_082d0b54","line":147,"in_reply_to":"7c9d2b15_d60d1ba8","updated":"2023-09-20 11:57:21.000000000","message":"Done","commit_id":"dc7ea641fde9a87f9701324edc833483ce37500a"}],"tvix/store/src/fuse/tests.rs":[{"author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"change_message_id":"881b1ed1f0e1c3aebb86dec9665bb5916363457f","unresolved":true,"context_lines":[{"line_number":40,"context_line":"    path_info_service: Arc\u003cdyn PathInfoService\u003e,"},{"line_number":41,"context_line":"    mountpoint: P,"},{"line_number":42,"context_line":"    list_root: bool,"},{"line_number":43,"context_line":") -\u003e io::Result\u003cFuseDaemon\u003e {"},{"line_number":44,"context_line":"    let fs \u003d FUSE::new("},{"line_number":45,"context_line":"        blob_service,"},{"line_number":46,"context_line":"        directory_service,"}],"source_content_type":"text/x-rustsrc","patch_set":8,"id":"139e50fc_fbd7b3bf","line":43,"updated":"2023-09-18 11:15:14.000000000","message":"The tests all seem to fail for me (when invoking `cargo test` on my machine). They\u0027re skipped in CI because we don\u0027t have /dev/fuse in the sandbox.\n\nExample:\n\n```\n---- fuse::tests::root stdout ----\nthread \u0027fuse::tests::root\u0027 panicked at \u0027must succeed: Custom { kind: Other, error: \"fuse session failure: Unexpected exit code when running fusermount: Some(1)\" }\u0027, store/src/fuse/tests.rs:327:6\n```\n\nI ran the `tvix-store mount` command locally, and it\u0027s happening due to this:\n\n```\n❯ target/release-with-debug/tvix-store mount -l /tmp/tvix\n  2023-09-18T11:09:36.668087Z  INFO tvix_store: mounting tvix-store on \"/tmp/tvix\"\n    at store/src/bin/tvix-store.rs:311\n\nfusermount3: option allow_other only allowed if \u0027user_allow_other\u0027 is set in /etc/fuse.conf\nError: Custom { kind: Other, error: \"fuse session failure: Unexpected exit code when running fusermount: Some(1)\" }\n```\n\nBeing able to mount as non-root without any additional system-wide config seems desirable.\n\nI did some quick digging, seems fuse-backend-rs hardcodes this in https://github.com/cloud-hypervisor/fuse-backend-rs/blob/1e5b2acbc0492cc79006261109b7880bfe0fedb9/src/transport/fusedev/linux_session.rs#L384\n\nMaybe we can make this configurable upstream?","commit_id":"66117a13921321ada5a8b6555046c8ab7efd21bd"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"1aa4da0b534149632aff61fceacf32ee3c41f678","unresolved":true,"context_lines":[{"line_number":40,"context_line":"    path_info_service: Arc\u003cdyn PathInfoService\u003e,"},{"line_number":41,"context_line":"    mountpoint: P,"},{"line_number":42,"context_line":"    list_root: bool,"},{"line_number":43,"context_line":") -\u003e io::Result\u003cFuseDaemon\u003e {"},{"line_number":44,"context_line":"    let fs \u003d FUSE::new("},{"line_number":45,"context_line":"        blob_service,"},{"line_number":46,"context_line":"        directory_service,"}],"source_content_type":"text/x-rustsrc","patch_set":8,"id":"1da634ef_2223ebc1","line":43,"in_reply_to":"139e50fc_fbd7b3bf","updated":"2023-09-18 13:58:35.000000000","message":"I\u0027ll go upstream and see if they\u0027d take a patch to make this configurable.","commit_id":"66117a13921321ada5a8b6555046c8ab7efd21bd"},{"author":{"_account_id":1000036,"name":"flokli","email":"flokli@flokli.de","username":"flokli"},"change_message_id":"292d9f5c8a33e7ba9e029daa19009adfcd24966b","unresolved":true,"context_lines":[{"line_number":40,"context_line":"    path_info_service: Arc\u003cdyn PathInfoService\u003e,"},{"line_number":41,"context_line":"    mountpoint: P,"},{"line_number":42,"context_line":"    list_root: bool,"},{"line_number":43,"context_line":") -\u003e io::Result\u003cFuseDaemon\u003e {"},{"line_number":44,"context_line":"    let fs \u003d FUSE::new("},{"line_number":45,"context_line":"        blob_service,"},{"line_number":46,"context_line":"        directory_service,"}],"source_content_type":"text/x-rustsrc","patch_set":8,"id":"862d1077_5f9f0c42","line":43,"in_reply_to":"1da634ef_2223ebc1","updated":"2023-09-18 14:03:58.000000000","message":"❤️","commit_id":"66117a13921321ada5a8b6555046c8ab7efd21bd"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"e8562fba1a9dc906bb5e412dff3b05a14452b344","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    path_info_service: Arc\u003cdyn PathInfoService\u003e,"},{"line_number":41,"context_line":"    mountpoint: P,"},{"line_number":42,"context_line":"    list_root: bool,"},{"line_number":43,"context_line":") -\u003e io::Result\u003cFuseDaemon\u003e {"},{"line_number":44,"context_line":"    let fs \u003d FUSE::new("},{"line_number":45,"context_line":"        blob_service,"},{"line_number":46,"context_line":"        directory_service,"}],"source_content_type":"text/x-rustsrc","patch_set":8,"id":"156cd996_e087ca97","line":43,"in_reply_to":"8378c5b6_ee1ee692","updated":"2023-09-19 17:15:12.000000000","message":"Going to point this at my branch for now so we don\u0027t block landing this. We can switch back to upstream once its merged in.","commit_id":"66117a13921321ada5a8b6555046c8ab7efd21bd"},{"author":{"_account_id":1000085,"name":"Connor Brewster","display_name":"cbrewster","email":"cbrewster@hey.com","username":"cbrewster"},"change_message_id":"2e414ffaad5d6d270457a5d44248102cadb98013","unresolved":true,"context_lines":[{"line_number":40,"context_line":"    path_info_service: Arc\u003cdyn PathInfoService\u003e,"},{"line_number":41,"context_line":"    mountpoint: P,"},{"line_number":42,"context_line":"    list_root: bool,"},{"line_number":43,"context_line":") -\u003e io::Result\u003cFuseDaemon\u003e {"},{"line_number":44,"context_line":"    let fs \u003d FUSE::new("},{"line_number":45,"context_line":"        blob_service,"},{"line_number":46,"context_line":"        directory_service,"}],"source_content_type":"text/x-rustsrc","patch_set":8,"id":"8378c5b6_ee1ee692","line":43,"in_reply_to":"862d1077_5f9f0c42","updated":"2023-09-19 16:41:20.000000000","message":"Upstream pull request: https://github.com/cloud-hypervisor/fuse-backend-rs/pull/153","commit_id":"66117a13921321ada5a8b6555046c8ab7efd21bd"}]}
