You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by fd...@apache.org on 2012/01/23 00:43:12 UTC

[6/50] git commit: Propagate file read errors to callers

Propagate file read errors to callers

Instead of having the file reader process crash with
a badmatch after a file:pread/3, send the result to
to the caller, which will in turn get a badmatch error.
The advantage of this is to get a much more meaningful
stack trace (relative to the client).


Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/6e38856a
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/6e38856a
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/6e38856a

Branch: refs/heads/COUCHDB-1342
Commit: 6e38856a0a7c2a2030208a7af62061673bd056f2
Parents: 4f7336e
Author: Filipe David Borba Manana <fd...@apache.org>
Authored: Sun Jan 22 13:15:15 2012 +0000
Committer: Filipe David Borba Manana <fd...@apache.org>
Committed: Sun Jan 22 13:15:15 2012 +0000

----------------------------------------------------------------------
 src/couchdb/couch_file.erl |   42 +++++++++++++++++++++++++-------------
 1 files changed, 27 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/6e38856a/src/couchdb/couch_file.erl
----------------------------------------------------------------------
diff --git a/src/couchdb/couch_file.erl b/src/couchdb/couch_file.erl
index bb69004..6e08cca 100644
--- a/src/couchdb/couch_file.erl
+++ b/src/couchdb/couch_file.erl
@@ -132,16 +132,19 @@ pread_binary(Fd, Pos) ->
 
 
 pread_iolist(Fd, Pos) ->
-    case do_read_iolist(Fd, Pos) of
+    case try_read_iolist(Fd, Pos) of
     eof ->
-        flush(Fd),
-        do_read_iolist(Fd, Pos);
+        ok = flush(Fd),
+        try_read_iolist(Fd, Pos);
+    {unexpected_binary, _, _, _} ->
+        ok = flush(Fd),
+        try_read_iolist(Fd, Pos);
     Else ->
         Else
     end.
 
 
-do_read_iolist(Fd, Pos) ->
+try_read_iolist(Fd, Pos) ->
     case gen_server:call(Fd, {pread_iolist, Pos}, infinity) of
     {ok, _IoList} = Ok ->
         Ok;
@@ -486,8 +489,16 @@ read_raw_iolist_int(ReadFd, Pos, Len) ->
     case file:pread(ReadFd, Pos, TotalBytes) of
     {ok, <<RawBin:TotalBytes/binary>>} ->
         {remove_block_prefixes(BlockOffset, RawBin), Pos + TotalBytes};
-    eof ->
-        throw(eof)
+    {ok, RawBin} ->
+        UnexpectedBin = {
+            unexpected_binary,
+            {at, Pos},
+            {wanted_bytes, TotalBytes},
+            {got, byte_size(RawBin), RawBin}
+        },
+        throw({read_error, UnexpectedBin});
+    Else ->
+        throw({read_error, Else})
     end.
 
 -spec extract_md5(iolist()) -> {binary(), iolist()}.
@@ -664,13 +675,7 @@ write_header_blocks(Fd, Eof, Header) ->
 reader_loop(Fd) ->
     receive
     {read, Pos, From} ->
-        Result = try
-            read_iolist(Fd, Pos)
-        catch
-        throw:eof ->
-            eof
-        end,
-        gen_server:reply(From, Result),
+        gen_server:reply(From, read_iolist(Fd, Pos)),
         reader_loop(Fd);
     {find_header, Eof, From} ->
         gen_server:reply(From, find_header(Fd, Eof div ?SIZE_BLOCK)),
@@ -681,9 +686,16 @@ reader_loop(Fd) ->
     end.
 
 
--compile({inline, [read_iolist/2]}).
-
 read_iolist(Fd, Pos) ->
+    try
+        do_read_iolist(Fd, Pos)
+    catch throw:{read_error, Error} ->
+        Error
+    end.
+
+-compile({inline, [do_read_iolist/2]}).
+
+do_read_iolist(Fd, Pos) ->
     {RawData, NextPos} = try
         % up to 8Kbs of read ahead
         read_raw_iolist_int(Fd, Pos, 2 * ?SIZE_BLOCK - (Pos rem ?SIZE_BLOCK))