|
15 | 15 | #include "model/adl_serde.h"
|
16 | 16 | #include "model/fundamental.h"
|
17 | 17 | #include "model/namespace.h"
|
| 18 | +#include "model/offset_interval.h" |
18 | 19 | #include "model/record_batch_types.h"
|
19 | 20 | #include "model/timeout_clock.h"
|
20 | 21 | #include "model/timestamp.h"
|
@@ -1898,12 +1899,23 @@ ss::future<size_t> disk_log_impl::get_file_offset(
|
1898 | 1899 | ss::future<std::optional<log::offset_range_size_result_t>>
|
1899 | 1900 | disk_log_impl::offset_range_size(
|
1900 | 1901 | model::offset first, model::offset last, ss::io_priority_class io_priority) {
|
| 1902 | + auto log_offsets = offsets(); |
1901 | 1903 | vlog(
|
1902 | 1904 | stlog.debug,
|
1903 | 1905 | "Offset range size, first: {}, last: {}, lstat: {}",
|
1904 | 1906 | first,
|
1905 | 1907 | last,
|
1906 |
| - offsets()); |
| 1908 | + log_offsets); |
| 1909 | + auto log_interval = model::bounded_offset_interval::optional( |
| 1910 | + log_offsets.start_offset, log_offsets.committed_offset); |
| 1911 | + if (!log_interval.has_value()) { |
| 1912 | + vlog(stlog.debug, "Log is empty, returning early"); |
| 1913 | + co_return std::nullopt; |
| 1914 | + } |
| 1915 | + if (!log_interval->contains(first) || !log_interval->contains(last)) { |
| 1916 | + vlog(stlog.debug, "Log does not include entire range"); |
| 1917 | + co_return std::nullopt; |
| 1918 | + } |
1907 | 1919 |
|
1908 | 1920 | // build the collection
|
1909 | 1921 | const auto segments = [&] {
|
@@ -2066,13 +2078,25 @@ disk_log_impl::offset_range_size(
|
2066 | 2078 | model::offset first,
|
2067 | 2079 | offset_range_size_requirements_t target,
|
2068 | 2080 | ss::io_priority_class io_priority) {
|
| 2081 | + auto log_offsets = offsets(); |
2069 | 2082 | vlog(
|
2070 | 2083 | stlog.debug,
|
2071 | 2084 | "Offset range size, first: {}, target size: {}/{}, lstat: {}",
|
2072 | 2085 | first,
|
2073 | 2086 | target.target_size,
|
2074 | 2087 | target.min_size,
|
2075 |
| - offsets()); |
| 2088 | + log_offsets); |
| 2089 | + auto log_interval = model::bounded_offset_interval::optional( |
| 2090 | + log_offsets.start_offset, log_offsets.committed_offset); |
| 2091 | + if (!log_interval.has_value()) { |
| 2092 | + vlog(stlog.debug, "Log is empty, returning early"); |
| 2093 | + co_return std::nullopt; |
| 2094 | + } |
| 2095 | + if (!log_interval->contains(first)) { |
| 2096 | + vlog(stlog.debug, "Log does not include offset {}", first); |
| 2097 | + co_return std::nullopt; |
| 2098 | + } |
| 2099 | + |
2076 | 2100 | auto base_it = _segs.lower_bound(first);
|
2077 | 2101 |
|
2078 | 2102 | // Invariant: 'first' offset should be present in the log. If the segment is
|
|
0 commit comments