You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by ad...@apache.org on 2017/05/04 18:14:02 UTC

kudu git commit: env: unify ReadV and Read code paths

Repository: kudu
Updated Branches:
  refs/heads/master b15ea202d -> a3c5983d8


env: unify ReadV and Read code paths

Reduces similar and duplicate code by directing read calls
to use the ReadV implimentation with a single element vector.

Change-Id: I08538225c7db0eba0e83827b4c2dd5b507491580
Reviewed-on: http://gerrit.cloudera.org:8080/6799
Tested-by: Kudu Jenkins
Reviewed-by: Adar Dembo <ad...@cloudera.com>


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

Branch: refs/heads/master
Commit: a3c5983d8fa71f99e743bf384507baa5161332e4
Parents: b15ea20
Author: Grant Henke <gr...@gmail.com>
Authored: Thu May 4 12:47:31 2017 -0500
Committer: Adar Dembo <ad...@cloudera.com>
Committed: Thu May 4 18:13:39 2017 +0000

----------------------------------------------------------------------
 src/kudu/fs/file_block_manager.cc | 10 ++------
 src/kudu/fs/fs-test-util.h        |  5 ++--
 src/kudu/fs/log_block_manager.cc  | 28 ++--------------------
 src/kudu/util/env_posix.cc        | 43 ++++------------------------------
 4 files changed, 10 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kudu/blob/a3c5983d/src/kudu/fs/file_block_manager.cc
----------------------------------------------------------------------
diff --git a/src/kudu/fs/file_block_manager.cc b/src/kudu/fs/file_block_manager.cc
index 937f4ba..b2419ed 100644
--- a/src/kudu/fs/file_block_manager.cc
+++ b/src/kudu/fs/file_block_manager.cc
@@ -445,14 +445,8 @@ Status FileReadableBlock::Size(uint64_t* sz) const {
 }
 
 Status FileReadableBlock::Read(uint64_t offset, Slice* result) const {
-  DCHECK(!closed_.Load());
-
-  RETURN_NOT_OK(reader_->Read(offset, result));
-  if (block_manager_->metrics_) {
-    block_manager_->metrics_->total_bytes_read->IncrementBy(result->size());
-  }
-
-  return Status::OK();
+  vector<Slice> results = { *result };
+  return ReadV(offset, &results);
 }
 
 Status FileReadableBlock::ReadV(uint64_t offset, vector<Slice>* results) const {

http://git-wip-us.apache.org/repos/asf/kudu/blob/a3c5983d/src/kudu/fs/fs-test-util.h
----------------------------------------------------------------------
diff --git a/src/kudu/fs/fs-test-util.h b/src/kudu/fs/fs-test-util.h
index 23baa44..7f741af 100644
--- a/src/kudu/fs/fs-test-util.h
+++ b/src/kudu/fs/fs-test-util.h
@@ -64,9 +64,8 @@ class CountingReadableBlock : public ReadableBlock {
   }
 
   virtual Status Read(uint64_t offset, Slice* result) const OVERRIDE {
-    RETURN_NOT_OK(block_->Read(offset, result));
-    *bytes_read_ += result->size();
-    return Status::OK();
+    vector<Slice> results = { *result };
+    return ReadV(offset, &results);
   }
 
   virtual Status ReadV(uint64_t offset, std::vector<Slice>* results) const OVERRIDE {

http://git-wip-us.apache.org/repos/asf/kudu/blob/a3c5983d/src/kudu/fs/log_block_manager.cc
----------------------------------------------------------------------
diff --git a/src/kudu/fs/log_block_manager.cc b/src/kudu/fs/log_block_manager.cc
index 5f8f012..1a3490e 100644
--- a/src/kudu/fs/log_block_manager.cc
+++ b/src/kudu/fs/log_block_manager.cc
@@ -1316,32 +1316,8 @@ Status LogReadableBlock::Size(uint64_t* sz) const {
 }
 
 Status LogReadableBlock::Read(uint64_t offset, Slice* result) const {
-  DCHECK(!closed_.Load());
-
-  uint64_t read_offset = log_block_->offset() + offset;
-  if (log_block_->length() < offset + result->size()) {
-    return Status::IOError("Out-of-bounds read",
-                           Substitute("read of [$0-$1) in block [$2-$3)",
-                                      read_offset,
-                                      read_offset + result->size(),
-                                      log_block_->offset(),
-                                      log_block_->offset() + log_block_->length()));
-  }
-
-  MicrosecondsInt64 start_time = GetMonoTimeMicros();
-  RETURN_NOT_OK(container_->ReadData(read_offset, result));
-  MicrosecondsInt64 end_time = GetMonoTimeMicros();
-
-  int64_t dur = end_time - start_time;
-  TRACE_COUNTER_INCREMENT("lbm_read_time_us", dur);
-
-  const char* counter = BUCKETED_COUNTER_NAME("lbm_reads", dur);
-  TRACE_COUNTER_INCREMENT(counter, 1);
-
-  if (container_->metrics()) {
-    container_->metrics()->generic_metrics.total_bytes_read->IncrementBy(result->size());
-  }
-  return Status::OK();
+  vector<Slice> results = { *result };
+  return ReadV(offset, &results);
 }
 
 Status LogReadableBlock::ReadV(uint64_t offset, vector<Slice>* results) const {

http://git-wip-us.apache.org/repos/asf/kudu/blob/a3c5983d/src/kudu/util/env_posix.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/env_posix.cc b/src/kudu/util/env_posix.cc
index d2d658f..0179a26 100644
--- a/src/kudu/util/env_posix.cc
+++ b/src/kudu/util/env_posix.cc
@@ -276,43 +276,6 @@ Status DoOpen(const string& filename, Env::CreateMode mode, int* fd) {
   return Status::OK();
 }
 
-Status DoRead(int fd, const string& filename, uint64_t offset, Slice* result) {
-  ThreadRestrictions::AssertIOAllowed();
-  uint64_t cur_offset = offset;
-  uint8_t* dst = result->mutable_data();
-  size_t rem = result->size();
-  while (rem > 0) {
-    size_t req = rem;
-    // Inject a short read for testing
-    if (PREDICT_FALSE(FLAGS_env_inject_short_read_bytes > 0 && req == result->size())) {
-      DCHECK_LT(FLAGS_env_inject_short_read_bytes, req);
-      req -= FLAGS_env_inject_short_read_bytes;
-    }
-    ssize_t r;
-    RETRY_ON_EINTR(r, pread(fd, dst, req, cur_offset));
-    if (PREDICT_FALSE(r < 0)) {
-      // An error: return a non-ok status.
-      return IOError(filename, errno);
-    }
-    if (PREDICT_FALSE(r == 0)) {
-      // EOF
-      return Status::IOError(Substitute("EOF trying to read $0 bytes at offset $1",
-                                        result->size(), offset));
-    }
-    if (PREDICT_TRUE(r == rem)) {
-      // All requested bytes were read.
-      // This is almost always the case.
-      return Status::OK();
-    }
-    DCHECK_LE(r, rem);
-    dst += r;
-    rem -= r;
-    cur_offset += r;
-  }
-  DCHECK_EQ(0, rem);
-  return Status::OK();
-}
-
 Status DoReadV(int fd, const string& filename, uint64_t offset, vector<Slice>* results) {
   ThreadRestrictions::AssertIOAllowed();
 
@@ -430,7 +393,8 @@ class PosixRandomAccessFile: public RandomAccessFile {
   virtual ~PosixRandomAccessFile() { close(fd_); }
 
   virtual Status Read(uint64_t offset, Slice* result) const OVERRIDE {
-    return DoRead(fd_, filename_, offset, result);
+    vector<Slice> results = { *result };
+    return ReadV(offset, &results);
   }
 
   virtual Status ReadV(uint64_t offset, vector<Slice>* results) const OVERRIDE {
@@ -676,7 +640,8 @@ class PosixRWFile : public RWFile {
   }
 
   virtual Status Read(uint64_t offset, Slice* result) const OVERRIDE {
-    return DoRead(fd_, filename_, offset, result);
+    vector<Slice> results = { *result };
+    return ReadV(offset, &results);
   }
 
   virtual Status ReadV(uint64_t offset, vector<Slice>* results) const OVERRIDE {