| 364 | /// load storage from disk |
| 365 | #[inline] |
| 366 | async fn loader(&self) -> Result<(), String> { |
| 367 | // when storage just open with Disc Copies option it call loader, else it don't call |
| 368 | let wal = &self.wal_session; |
| 369 | |
| 370 | let mut page_index = 1; |
| 371 | |
| 372 | loop { |
| 373 | // Get Page |
| 374 | let mut logfile = match wal.get_page(page_index).await { |
| 375 | Ok(lf) => lf, |
| 376 | Err(sess_res) => { |
| 377 | if let SessionResult::Err(e) = sess_res { |
| 378 | return Err(e.to_string()) |
| 379 | } |
| 380 | |
| 381 | return Err("disk_log closed".to_string()) |
| 382 | } |
| 383 | }; |
| 384 | |
| 385 | page_index += 1; |
| 386 | |
| 387 | // Must Call Recover if return Err, remove unwrap() |
| 388 | let iter = match logfile.iter(..) { |
| 389 | Ok(iter) => iter, |
| 390 | Err(e) => { |
| 391 | eprintln!("==> {:?}", e); |
| 392 | return Err(e.to_string()); |
| 393 | } |
| 394 | }; |
| 395 | |
| 396 | for qline in iter { |
| 397 | let bytes = match qline { |
| 398 | Ok(ql) => ql, |
| 399 | Err(e) => return Err(e.to_string()), |
| 400 | }; |
| 401 | |
| 402 | let query: RQuery<K, Doc> = match bincode::deserialize(&bytes) { |
| 403 | Ok(rq) => rq, |
| 404 | Err(e) => { |
| 405 | return Err(e.to_string()); |
| 406 | } |
| 407 | }; |
| 408 | |
| 409 | match query { |
| 410 | RQuery::Insert(key, doc) => { |
| 411 | let _ = self.insert(key, doc).await; |
| 412 | } |
| 413 | RQuery::Remove(key) => { |
| 414 | let _ = self.remove(key).await; |
| 415 | } |
| 416 | } |
| 417 | } |
| 418 | } |
| 419 | } |
| 420 | } |
| 421 | |
| 422 | // used for log to disk |