(
&self,
file_offset: FileOffset,
)
| 305 | } |
| 306 | |
| 307 | pub fn get_data( |
| 308 | &self, |
| 309 | file_offset: FileOffset, |
| 310 | ) -> Result<*mut LazyItem<InvertedIndexNodeData, ()>, BufIoError> { |
| 311 | let combined_index = Self::combine_index(file_offset, 0); |
| 312 | |
| 313 | if let Some(item) = self.registry.get(&combined_index) { |
| 314 | return Ok(item); |
| 315 | } |
| 316 | |
| 317 | let mut mutex = self |
| 318 | .loading_data |
| 319 | .get_or_create(combined_index, || Arc::new(Mutex::new(false))); |
| 320 | let mut load_complete = mutex.lock().unwrap(); |
| 321 | |
| 322 | loop { |
| 323 | // check again |
| 324 | if let Some(item) = self.registry.get(&combined_index) { |
| 325 | return Ok(item); |
| 326 | } |
| 327 | |
| 328 | // another thread loaded the data but its not in the registry (got evicted), retry |
| 329 | if *load_complete { |
| 330 | drop(load_complete); |
| 331 | mutex = self |
| 332 | .loading_data |
| 333 | .get_or_create(combined_index, || Arc::new(Mutex::new(false))); |
| 334 | load_complete = mutex.lock().unwrap(); |
| 335 | continue; |
| 336 | } |
| 337 | |
| 338 | break; |
| 339 | } |
| 340 | |
| 341 | let data = InvertedIndexNodeData::deserialize( |
| 342 | &self.dim_bufman, |
| 343 | &self.data_bufmans, |
| 344 | file_offset, |
| 345 | VersionNumber::from(u32::MAX), // not used |
| 346 | self, |
| 347 | )?; |
| 348 | |
| 349 | let item = LazyItem::new(data, (), file_offset); |
| 350 | |
| 351 | self.registry.insert(combined_index, item); |
| 352 | |
| 353 | *load_complete = true; |
| 354 | self.loading_data.delete(&combined_index); |
| 355 | |
| 356 | Ok(item) |
| 357 | } |
| 358 | |
| 359 | pub fn combine_index(file_offset: FileOffset, data_file_idx: u8) -> u64 { |
| 360 | ((data_file_idx as u64) << 32) | file_offset.0 as u64 |
no test coverage detected