MCPcopy Create free account
hub / github.com/cosdata/cosdata / get_data

Method get_data

src/models/cache_loader.rs:307–357  ·  view source on GitHub ↗
(
        &self,
        file_offset: FileOffset,
    )

Source from the content-addressed store, hash-verified

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

Callers 4

try_get_dataMethod · 0.45
deserializeMethod · 0.45
deserializeMethod · 0.45
deserializeMethod · 0.45

Calls 4

get_or_createMethod · 0.80
getMethod · 0.45
insertMethod · 0.45
deleteMethod · 0.45

Tested by

no test coverage detected