| 407 | /// load storage from disk |
| 408 | #[inline] |
| 409 | async fn loader(&self) -> Result<(), String> { |
| 410 | // when storage just open with Disc Copies option it call loader, else it don't call |
| 411 | let wal = &self.wal_session; |
| 412 | |
| 413 | let mut page_index = 1; |
| 414 | |
| 415 | loop { |
| 416 | // Get Page |
| 417 | let mut logfile = match wal.get_page(page_index).await { |
| 418 | Ok(lf) => lf, |
| 419 | Err(sess_res) => { |
| 420 | if let SessionResult::Err(e) = sess_res { |
| 421 | return Err(e.to_string()) |
| 422 | } |
| 423 | |
| 424 | return Err("disk_log closed".to_string()) |
| 425 | } |
| 426 | }; |
| 427 | |
| 428 | page_index += 1; |
| 429 | |
| 430 | // Must Call Recover if return Err, remove unwrap() |
| 431 | let iter = match logfile.iter(..) { |
| 432 | Ok(iter) => iter, |
| 433 | Err(e) => { |
| 434 | eprintln!("==> {:?}", e); |
| 435 | return Err(e.to_string()); |
| 436 | } |
| 437 | }; |
| 438 | |
| 439 | for qline in iter { |
| 440 | let bytes = match qline { |
| 441 | Ok(ql) => ql, |
| 442 | Err(e) => return Err(e.to_string()), |
| 443 | }; |
| 444 | |
| 445 | let query: RQuery<VectorId, Vector> = match bincode::deserialize(&bytes) { |
| 446 | Ok(rq) => rq, |
| 447 | Err(e) => { |
| 448 | return Err(e.to_string()); |
| 449 | } |
| 450 | }; |
| 451 | |
| 452 | match query { |
| 453 | RQuery::Insert(vid, v) => { |
| 454 | let _ = self.insert(vid, v.0).await; |
| 455 | } |
| 456 | RQuery::Remove(vid) => { |
| 457 | let _ = self.remove(vid).await; |
| 458 | } |
| 459 | } |
| 460 | } |
| 461 | } |
| 462 | } |
| 463 | |
| 464 | |
| 465 | } |