Skip to content

Commit be9be9e

Browse files
committed
[filters] fix hit count
Related to #1639
1 parent 203ad76 commit be9be9e

8 files changed

Lines changed: 55 additions & 37 deletions

File tree

src/filter_observer.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ line_filter_observer::logline_new_lines(const logfile& lf,
6262

6363
for (; ll_begin != ll_end; ++ll_begin) {
6464
auto sbr_copy = sbr.clone();
65-
if (lf.get_format() != nullptr) {
66-
lf.get_format()->get_subline(
65+
auto* format = lf.get_format_ptr();
66+
if (format != nullptr) {
67+
format->get_subline(
6768
lf.get_format_file_state(), *ll_begin, sbr_copy);
6869
}
6970
sbr_copy.erase_ansi();

src/logfile.cc

Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,26 @@ logfile::file_options_have_changed()
310310
return tz_changed;
311311
}
312312

313+
void
314+
logfile::reset_internal_state_for_reindex()
315+
{
316+
this->lf_index.clear();
317+
this->lf_index_size = 0;
318+
this->lf_level_stats = {};
319+
this->lf_partial_line = false;
320+
this->lf_longest_line = 0;
321+
this->lf_sort_needed = true;
322+
this->lf_out_of_time_order_count = 0;
323+
this->lf_pattern_locks.pl_lines.clear();
324+
this->lf_value_stats.clear();
325+
this->lf_opids.writeAccess()->clear();
326+
this->lf_thread_ids.writeAccess()->clear();
327+
this->lf_allocator.reset();
328+
if (this->lf_logline_observer) {
329+
this->lf_logline_observer->logline_clear(*this);
330+
}
331+
}
332+
313333
logfile::map_entry_result
314334
logfile::find_content_map_entry(file_off_t offset, map_read_requirement req)
315335
{
@@ -1155,15 +1175,7 @@ logfile::process_prefix(shared_buffer_ref& sbr,
11551175
}
11561176

11571177
if (format_changed) {
1158-
this->lf_index_size = 0;
1159-
this->lf_level_stats = log_level_stats{};
1160-
this->lf_longest_line = 0;
1161-
this->lf_out_of_time_order_count = 0;
1162-
this->lf_opids.writeAccess()->clear();
1163-
this->lf_thread_ids.writeAccess()->clear();
1164-
this->lf_value_stats.clear();
1165-
this->lf_pattern_locks.pl_lines.clear();
1166-
this->lf_index.clear();
1178+
this->reset_internal_state_for_reindex();
11671179
retval = true;
11681180
} else {
11691181
/*
@@ -1361,29 +1373,7 @@ logfile::rebuild_index(std::optional<ui_clock::time_point> deadline)
13611373
{
13621374
log_info("%s: format has changed, rebuilding",
13631375
this->lf_filename_as_string.c_str());
1364-
this->lf_index.clear();
1365-
this->lf_index_size = 0;
1366-
this->lf_partial_line = false;
1367-
this->lf_longest_line = 0;
1368-
this->lf_sort_needed = true;
1369-
this->lf_pattern_locks.pl_lines.clear();
1370-
this->lf_value_stats.clear();
1371-
{
1372-
safe::WriteAccess<safe_opid_state> writable_opid_map(
1373-
this->lf_opids);
1374-
1375-
writable_opid_map->los_opid_ranges.clear();
1376-
writable_opid_map->los_sub_in_use.clear();
1377-
}
1378-
{
1379-
auto tids = this->lf_thread_ids.writeAccess();
1380-
1381-
tids->ltis_tid_ranges.clear();
1382-
}
1383-
this->lf_allocator.reset();
1384-
if (this->lf_logline_observer) {
1385-
this->lf_logline_observer->logline_clear(*this);
1386-
}
1376+
this->reset_internal_state_for_reindex();
13871377
}
13881378
this->lf_zoned_to_local_state = dts_cfg.c_zoned_to_local;
13891379

src/logfile.hh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,8 @@ private:
547547

548548
bool file_options_have_changed();
549549

550+
void reset_internal_state_for_reindex();
551+
550552
std::filesystem::path lf_filename;
551553
std::string lf_filename_as_string;
552554
logfile_open_options lf_options;

src/textview_curses.cc

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ text_filter::revert_to_last(logfile_filter_state& lfs, size_t rollback_size)
5858
= lfs.tfs_last_message_matched[this->lf_index];
5959
lfs.tfs_lines_for_message[this->lf_index]
6060
= lfs.tfs_last_lines_for_message[this->lf_index];
61+
lfs.tfs_hits_for_message[this->lf_index]
62+
= lfs.tfs_last_hits_for_message[this->lf_index];
6163

6264
for (size_t lpc = 0; lpc < lfs.tfs_lines_for_message[this->lf_index]; lpc++)
6365
{
@@ -92,6 +94,9 @@ text_filter::add_line(logfile_filter_state& lfs,
9294
lfs.tfs_message_matched[this->lf_index]
9395
= lfs.tfs_message_matched[this->lf_index] || retval;
9496
lfs.tfs_lines_for_message[this->lf_index] += 1;
97+
if (retval) {
98+
lfs.tfs_hits_for_message[this->lf_index] += 1;
99+
}
95100

96101
return retval;
97102
}
@@ -117,16 +122,18 @@ text_filter::end_of_message(logfile_filter_state& lfs)
117122
lfs.tfs_mask[line_number] &= ~mask;
118123
}
119124
lfs.tfs_filter_count[this->lf_index] += 1;
120-
if (lfs.tfs_message_matched[this->lf_index]) {
121-
lfs.tfs_filter_hits[this->lf_index] += 1;
122-
}
123125
}
126+
lfs.tfs_filter_hits[this->lf_index]
127+
+= lfs.tfs_hits_for_message[this->lf_index];
124128
lfs.tfs_last_message_matched[this->lf_index]
125129
= lfs.tfs_message_matched[this->lf_index];
126130
lfs.tfs_last_lines_for_message[this->lf_index]
127131
= lfs.tfs_lines_for_message[this->lf_index];
132+
lfs.tfs_last_hits_for_message[this->lf_index]
133+
= lfs.tfs_hits_for_message[this->lf_index];
128134
lfs.tfs_message_matched[this->lf_index] = false;
129135
lfs.tfs_lines_for_message[this->lf_index] = 0;
136+
lfs.tfs_hits_for_message[this->lf_index] = 0;
130137
}
131138

132139
void
@@ -1604,6 +1611,7 @@ logfile_filter_state::logfile_filter_state(std::shared_ptr<logfile> lf)
16041611
memset(this->tfs_filter_hits, 0, sizeof(this->tfs_filter_hits));
16051612
memset(this->tfs_message_matched, 0, sizeof(this->tfs_message_matched));
16061613
memset(this->tfs_lines_for_message, 0, sizeof(this->tfs_lines_for_message));
1614+
memset(this->tfs_hits_for_message, 0, sizeof(this->tfs_hits_for_message));
16071615
memset(this->tfs_last_message_matched,
16081616
0,
16091617
sizeof(this->tfs_last_message_matched));
@@ -1623,10 +1631,12 @@ logfile_filter_state::clear()
16231631
void
16241632
logfile_filter_state::clear_for_rebuild()
16251633
{
1634+
log_debug("clearing filter state");
16261635
memset(this->tfs_filter_count, 0, sizeof(this->tfs_filter_count));
16271636
memset(this->tfs_filter_hits, 0, sizeof(this->tfs_filter_hits));
16281637
memset(this->tfs_message_matched, 0, sizeof(this->tfs_message_matched));
16291638
memset(this->tfs_lines_for_message, 0, sizeof(this->tfs_lines_for_message));
1639+
memset(this->tfs_hits_for_message, 0, sizeof(this->tfs_hits_for_message));
16301640
memset(this->tfs_last_message_matched,
16311641
0,
16321642
sizeof(this->tfs_last_message_matched));
@@ -1644,6 +1654,7 @@ logfile_filter_state::clear_filter_state(size_t index)
16441654
this->tfs_filter_hits[index] = 0;
16451655
this->tfs_message_matched[index] = false;
16461656
this->tfs_lines_for_message[index] = 0;
1657+
this->tfs_hits_for_message[index] = 0;
16471658
this->tfs_last_message_matched[index] = false;
16481659
this->tfs_last_lines_for_message[index] = 0;
16491660
}

src/textview_curses.hh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,10 @@ public:
8484
int tfs_filter_hits[MAX_FILTERS];
8585
bool tfs_message_matched[MAX_FILTERS];
8686
size_t tfs_lines_for_message[MAX_FILTERS];
87+
size_t tfs_hits_for_message[MAX_FILTERS];
8788
bool tfs_last_message_matched[MAX_FILTERS];
8889
size_t tfs_last_lines_for_message[MAX_FILTERS];
90+
size_t tfs_last_hits_for_message[MAX_FILTERS];
8991
std::vector<uint32_t> tfs_mask;
9092
std::vector<uint32_t> tfs_index;
9193
};

test/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ dist_noinst_DATA = \
359359
logfile_epoch.0 \
360360
logfile_epoch.1 \
361361
logfile_filter.0 \
362+
logfile_filter.1 \
362363
logfile_for_join.0 \
363364
logfile_generic.0 \
364365
logfile_generic.1 \

test/logfile_filter.1

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
hello
2+
hello
3+
bye
4+
Mar 22 13:41:18 Timothys-MacBook-Pro syslogd[557]: ASL Sender Statistics
5+
hello

test/test_sql_views_vtab.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ view_name,filter_id,hits
128128
log,1,2
129129
EOF
130130

131+
run_cap_test ${lnav_test} -n \
132+
-c ":filter-in hello" \
133+
-c ";SELECT * FROM lnav_view_filter_stats" \
134+
-c ":write-csv-to -" \
135+
${test_dir}/logfile_filter.1
136+
131137
run_test ${lnav_test} -n \
132138
-c ";INSERT INTO lnav_view_filters (view_name, language, pattern) VALUES ('log', 'sql', ':sc_bytes = 134')" \
133139
${test_dir}/logfile_access_log.0

0 commit comments

Comments
 (0)