diff --git a/src/server/core/core-read-op.cpp b/src/server/core/core-read-op.cpp index 765344475a8a71949bcfdd29c77c5b0b8fd7ecbf..a8dcd64e26fac0b54dc6e4d898da58475e140b5d 100644 --- a/src/server/core/core-read-op.cpp +++ b/src/server/core/core-read-op.cpp @@ -196,12 +196,10 @@ void read_op_exec_read(void* u, uint64_t offset, size_t len, buffer_u buf, size_ case seg_type_t::ZERO: coverage.set(seg.start_index, seg.end_index); - if(*bytes_read < seg.end_index) *bytes_read = seg.end_index; break; case seg_type_t::TOMBSTONE: coverage.set(seg.start_index, seg.end_index); - if(*bytes_read < seg.start_index) *bytes_read = seg.start_index; break; case seg_type_t::BAKE_REGION: { @@ -218,7 +216,6 @@ void read_op_exec_read(void* u, uint64_t offset, size_t len, buffer_u buf, size_ LEAVING; return; } - if(*bytes_read < r.end) *bytes_read = r.end; } break; } // end case seg_type_t::BAKE_REGION @@ -258,7 +255,6 @@ void read_op_exec_read(void* u, uint64_t offset, size_t len, buffer_u buf, size_ LEAVING; return; } // end if - if(*bytes_read < r.end) *bytes_read = r.end; } // end for } // end case seg_type_t::SMALL_REGION @@ -267,6 +263,7 @@ void read_op_exec_read(void* u, uint64_t offset, size_t len, buffer_u buf, size_ if(num_segments != max_segments) done = true; } + *bytes_read = coverage.bytes_read(); LEAVING; } diff --git a/src/server/core/covermap.hpp b/src/server/core/covermap.hpp index b4a0369e59861e91c13c2206725346b6f4d237f7..1fbd070681a67bb3d053a5c7c90f93f14a954a04 100644 --- a/src/server/core/covermap.hpp +++ b/src/server/core/covermap.hpp @@ -37,13 +37,15 @@ class covermap { }; covermap(T s, T e) - : m_start(s), m_end(e) {} + : m_start(s), m_end(e), m_level(0) {} std::list set(T start, T end) { // make start and end match the bounds if(start < m_start) start = m_start; if(end > m_end) end = m_end; + if(end-start == 0) return std::list(); + std::list result; // easy case: the coverage map is empty if(m_segments.empty()) { @@ -115,6 +117,18 @@ class covermap { bool full() const { return capacity() == level(); } + + uint64_t bytes_read() const { + if(full()) return capacity(); + if(m_segments.empty()) return 0; + uint64_t start = m_end; + uint64_t end = m_start; + for(const auto& s : m_segments) { + if(s.first < start) start = s.first; + if(s.second > end) end = s.second; + } + return end-start; + } }; #endif