mount an atproto PDS repository as a FUSE filesystem oppi.li/posts/mounting_the_atmosphere/

Initialize tokio once #10

closed opened by danabra.mov targeting main

for perf

Labels

None yet.

Participants 1
AT URI
at://did:plc:fpruhuo22xkm5o7ttr2ktxdo/sh.tangled.repo.pull/3m34dxbapss22
+9 -5
Diff #0
+9 -5
src/fs.rs
··· 1 - use std::time::{self, SystemTime, UNIX_EPOCH, Duration}; 2 3 use atrium_repo::{Repository, blockstore::AsyncBlockStoreRead}; 4 use futures::StreamExt; ··· 30 pub struct PdsFs<R> { 31 repos: IndexMap<String, Repository<R>>, 32 inodes: IndexSet<PdsFsEntry>, 33 } 34 35 #[derive(Debug, Clone, PartialEq, Eq, Hash)] ··· 112 PdsFs { 113 repos: Default::default(), 114 inodes: IndexSet::from([PdsFsEntry::Zero, PdsFsEntry::Root]), 115 } 116 } 117 ··· 185 let did = self.inodes[col.parent].unwrap_did(); 186 let repo = &mut self.repos[did]; 187 let key = format!("{}/{}", col.nsid, r.rkey); 188 - let rt = tokio::runtime::Runtime::new().unwrap(); 189 - let size = rt 190 .block_on(repo.get_raw::<ipld_core::ipld::Ipld>(&key)) 191 .ok() 192 .flatten() ··· 402 _lock: Option<u64>, 403 reply: fuser::ReplyData, 404 ) { 405 - let rt = tokio::runtime::Runtime::new().unwrap(); 406 if let Some(PdsFsEntry::Record(r)) = self.inodes.get_index(ino as usize) { 407 let col = self.inodes[r.parent].unwrap_collection(); 408 let did = self.inodes[col.parent].unwrap_did(); 409 let repo = &mut self.repos[did]; 410 let key = format!("{}/{}", col.nsid, r.rkey); 411 412 - if let Ok(Some(val)) = rt.block_on(repo.get_raw::<ipld_core::ipld::Ipld>(&key)) { 413 reply.data(&serde_json::to_string(&val).unwrap().as_bytes()[offset as usize..]); 414 return; 415 }
··· 1 + use std::time::{self, Duration, SystemTime, UNIX_EPOCH}; 2 3 use atrium_repo::{Repository, blockstore::AsyncBlockStoreRead}; 4 use futures::StreamExt; ··· 30 pub struct PdsFs<R> { 31 repos: IndexMap<String, Repository<R>>, 32 inodes: IndexSet<PdsFsEntry>, 33 + rt: tokio::runtime::Runtime, 34 } 35 36 #[derive(Debug, Clone, PartialEq, Eq, Hash)] ··· 113 PdsFs { 114 repos: Default::default(), 115 inodes: IndexSet::from([PdsFsEntry::Zero, PdsFsEntry::Root]), 116 + rt: tokio::runtime::Runtime::new().unwrap(), 117 } 118 } 119 ··· 187 let did = self.inodes[col.parent].unwrap_did(); 188 let repo = &mut self.repos[did]; 189 let key = format!("{}/{}", col.nsid, r.rkey); 190 + let size = self 191 + .rt 192 .block_on(repo.get_raw::<ipld_core::ipld::Ipld>(&key)) 193 .ok() 194 .flatten() ··· 404 _lock: Option<u64>, 405 reply: fuser::ReplyData, 406 ) { 407 if let Some(PdsFsEntry::Record(r)) = self.inodes.get_index(ino as usize) { 408 let col = self.inodes[r.parent].unwrap_collection(); 409 let did = self.inodes[col.parent].unwrap_did(); 410 let repo = &mut self.repos[did]; 411 let key = format!("{}/{}", col.nsid, r.rkey); 412 413 + if let Ok(Some(val)) = self 414 + .rt 415 + .block_on(repo.get_raw::<ipld_core::ipld::Ipld>(&key)) 416 + { 417 reply.data(&serde_json::to_string(&val).unwrap().as_bytes()[offset as usize..]); 418 return; 419 }

History

1 round 0 comments
sign up or login to add to the discussion
danabra.mov submitted #0
expand 0 comments
closed without merging