From 0bb53636e4925ff98cc01dec8ac45299a0308832 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Tue, 19 Apr 2016 20:14:31 -0600
Subject: [PATCH] Faster read from disk if cache miss

---
 scheme/cache/mod.rs | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/scheme/cache/mod.rs b/scheme/cache/mod.rs
index faa1ad4..0709103 100644
--- a/scheme/cache/mod.rs
+++ b/scheme/cache/mod.rs
@@ -35,6 +35,7 @@ impl<T: Disk> Disk for Cache<T> {
         // println!("Cache read at {}", block);
 
         let mut read = 0;
+        let mut failed = false;
         for i in 0..(buffer.len() + 511)/512 {
             let block_i = block + i as u64;
 
@@ -42,18 +43,27 @@ impl<T: Disk> Disk for Cache<T> {
             let buffer_j = cmp::min(buffer_i + 512, buffer.len());
             let buffer_slice = &mut buffer[buffer_i .. buffer_j];
 
-            //Just to fix the borrow checker in the else
-            let mut failed = false;
             if let Some(cache_buf) = self.cache.get_mut(&block_i) {
                 read += copy_memory(cache_buf, buffer_slice);
             }else{
                 failed = true;
+                break;
             }
+        }
+
+        if failed {
+            try!(self.inner.read_at(block, buffer));
+
+            read = 0;
+            for i in 0..(buffer.len() + 511)/512 {
+                let block_i = block + i as u64;
+
+                let buffer_i = i * 512;
+                let buffer_j = cmp::min(buffer_i + 512, buffer.len());
+                let buffer_slice = &buffer[buffer_i .. buffer_j];
 
-            if failed {
                 let mut cache_buf = [0; 512];
-                try!(self.inner.read_at(block_i, &mut cache_buf));
-                read += copy_memory(&cache_buf, buffer_slice);
+                read += copy_memory(buffer_slice, &mut cache_buf);
                 self.cache.insert(block_i, cache_buf);
             }
         }
@@ -64,7 +74,7 @@ impl<T: Disk> Disk for Cache<T> {
     fn write_at(&mut self, block: u64, buffer: &[u8]) -> Result<usize> {
         // println!("Cache write at {}", block);
 
-        try!(self.inner.write_at(block, &buffer));
+        try!(self.inner.write_at(block, buffer));
 
         let mut written = 0;
         for i in 0..(buffer.len() + 511)/512 {
-- 
GitLab