mirror of
https://github.com/tstack/lnav
synced 2024-11-01 21:40:34 +00:00
[logfile] fix handling of partial lines
This commit is contained in:
parent
df082eaf16
commit
7b32ea9d39
@ -1154,7 +1154,11 @@ line_buffer::read_range(const file_range fr)
|
|||||||
* Don't return anything past the last known line. The caller needs
|
* Don't return anything past the last known line. The caller needs
|
||||||
* to try reading at the offset of the last line again.
|
* to try reading at the offset of the last line again.
|
||||||
*/
|
*/
|
||||||
return Err(std::string("out-of-bounds"));
|
return Err(
|
||||||
|
fmt::format(FMT_STRING("attempt to read past the known end of the "
|
||||||
|
"file: read-offset={}; last_line_offset={}"),
|
||||||
|
fr.fr_offset,
|
||||||
|
this->lb_last_line_offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(this->in_range(fr.fr_offset)
|
if (!(this->in_range(fr.fr_offset)
|
||||||
|
@ -300,7 +300,8 @@ logfile::process_prefix(shared_buffer_ref& sbr,
|
|||||||
this->lf_out_of_time_order_count += 1;
|
this->lf_out_of_time_order_count += 1;
|
||||||
for (size_t lpc = prescan_size;
|
for (size_t lpc = prescan_size;
|
||||||
lpc < this->lf_index.size();
|
lpc < this->lf_index.size();
|
||||||
lpc++) {
|
lpc++)
|
||||||
|
{
|
||||||
auto& line_to_update = this->lf_index[lpc];
|
auto& line_to_update = this->lf_index[lpc];
|
||||||
|
|
||||||
line_to_update.set_time_skew(true);
|
line_to_update.set_time_skew(true);
|
||||||
@ -519,7 +520,8 @@ logfile::rebuild_index(nonstd::optional<ui_clock::time_point> deadline)
|
|||||||
size_t old_size = this->lf_index.size();
|
size_t old_size = this->lf_index.size();
|
||||||
|
|
||||||
if (old_size == 0
|
if (old_size == 0
|
||||||
&& this->lf_text_format == text_format_t::TF_UNKNOWN) {
|
&& this->lf_text_format == text_format_t::TF_UNKNOWN)
|
||||||
|
{
|
||||||
file_range fr = this->lf_line_buffer.get_available();
|
file_range fr = this->lf_line_buffer.get_available();
|
||||||
auto avail_data = this->lf_line_buffer.read_range(fr);
|
auto avail_data = this->lf_line_buffer.read_range(fr);
|
||||||
|
|
||||||
@ -580,7 +582,8 @@ logfile::rebuild_index(nonstd::optional<ui_clock::time_point> deadline)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (begin_size == 0 && !has_format
|
if (begin_size == 0 && !has_format
|
||||||
&& li.li_file_range.fr_offset > 16 * 1024) {
|
&& li.li_file_range.fr_offset > 16 * 1024)
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
@ -595,6 +598,13 @@ logfile::rebuild_index(nonstd::optional<ui_clock::time_point> deadline)
|
|||||||
lnav::log::watch::eval_with(*this, this->end() - 1);
|
lnav::log::watch::eval_with(*this, this->end() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (li.li_partial) {
|
||||||
|
// The last read was at the end of the file, so break. We'll
|
||||||
|
// need to cycle back around to pop off this partial line in
|
||||||
|
// order to continue reading correctly.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
limit -= 1;
|
limit -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -620,7 +630,8 @@ logfile::rebuild_index(nonstd::optional<ui_clock::time_point> deadline)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (record_rusage
|
if (record_rusage
|
||||||
&& (prev_range.fr_offset - begin_index_size) > (500 * 1024)) {
|
&& (prev_range.fr_offset - begin_index_size) > (500 * 1024))
|
||||||
|
{
|
||||||
struct rusage end_rusage;
|
struct rusage end_rusage;
|
||||||
|
|
||||||
getrusage(RUSAGE_SELF, &end_rusage);
|
getrusage(RUSAGE_SELF, &end_rusage);
|
||||||
@ -654,7 +665,8 @@ logfile::rebuild_index(nonstd::optional<ui_clock::time_point> deadline)
|
|||||||
writable_opid_map->emplace(opid_pair);
|
writable_opid_map->emplace(opid_pair);
|
||||||
} else {
|
} else {
|
||||||
if (opid_pair.second.otr_begin
|
if (opid_pair.second.otr_begin
|
||||||
< opid_iter->second.otr_begin) {
|
< opid_iter->second.otr_begin)
|
||||||
|
{
|
||||||
opid_iter->second.otr_begin
|
opid_iter->second.otr_begin
|
||||||
= opid_pair.second.otr_begin;
|
= opid_pair.second.otr_begin;
|
||||||
}
|
}
|
||||||
@ -950,7 +962,8 @@ logfile::line_for_offset(file_off_t off) const
|
|||||||
this->lf_index.begin(), this->lf_index.end(), off, cmper{});
|
this->lf_index.begin(), this->lf_index.end(), off, cmper{});
|
||||||
if (iter == this->lf_index.end()) {
|
if (iter == this->lf_index.end()) {
|
||||||
if (this->lf_index.back().get_offset() <= off
|
if (this->lf_index.back().get_offset() <= off
|
||||||
&& off < this->lf_index_size) {
|
&& off < this->lf_index_size)
|
||||||
|
{
|
||||||
return nonstd::make_optional(iter);
|
return nonstd::make_optional(iter);
|
||||||
}
|
}
|
||||||
return nonstd::nullopt;
|
return nonstd::nullopt;
|
||||||
|
Loading…
Reference in New Issue
Block a user