Skip to content

Commit 3a251ba

Browse files
avargitster
authored andcommitted
trace2: only include "fsync" events if we git_fsync()
Fix the overly verbose trace2 logging added in 9a49876 (trace2: add stats for fsync operations, 2022-03-30) (first released with v2.36.0). Since that change every single "git" command invocation has included these "data" events, even though we'll only make use of these with core.fsyncMethod=batch, and even then only have non-zero values if we're writing object data to disk. See c0f4752 (core.fsyncmethod: batched disk flushes for loose-objects, 2022-04-04) for that feature. As we're needing to indent the trace2_data_intmax() lines let's introduce helper variables to ensure that our resulting lines (which were already too) don't exceed the recommendations of the CodingGuidelines. Doing that requires either wrapping them twice, or introducing short throwaway variable names, let's do the latter. The result was that e.g. "git version" would previously emit a total of 6 trace2 events with the GIT_TRACE2_EVENT target (version, start, cmd_ancestry, cmd_name, exit, atexit), but afterwards would emit 8. We'd emit 2 "data" events before the "exit" event. The reason we didn't catch this was that the trace2 unit tests added in a15860d (trace2: t/helper/test-trace2, t0210.sh, t0211.sh, t0212.sh, 2019-02-22) would omit any "data" events that weren't the ones it cared about. Before this change to the C code 6/7 of our "t/t0212-trace2-event.sh" tests would fail if this change was applied to "t/t0212/parse_events.perl". Let's make the trace2 testing more strict, and further append any new events types we don't know about in "t/t0212/parse_events.perl". Since we only invoke the "test-tool trace2" there's no guarantee that we'll catch other overly verbose events in the future, but we'll at least notice if we start emitting new events that are issues every time we log anything with trace2's JSON target. We exclude the "data_json" event type, we'd otherwise would fail on both "win test" and "win+VS test" CI due to the logging added in 353d3d7 (trace2: collect Windows-specific process information, 2019-02-22). It looks like that logging should really be using trace2_cmd_ancestry() instead, which was introduced later in 2f732bf (tr2: log parent process name, 2021-07-21), but let's leave it for now. The fix-up to aaf8122 (unpack-objects: use stream_loose_object() to unpack large objects, 2022-06-11) is needed because we're changing the behavior of these events as discussed above. Since we'd always emit a "hardware-flush" event the test added in aaf8122 wasn't testing anything except that this trace2 data was unconditionally logged. Even if "core.fsyncMethod" wasn't set to "batch" we'd pass the test. Now we'll check the expected number of "writeout" v.s. "flush" calls under "core.fsyncMethod=batch", but note that this doesn't actually test if we carried out the sync using that method, on a platform where we'd have to fall back to fsync() each of those "writeout" would really be a "flush" (i.e. a full fsync()). But in this case what we're testing is that the logic in "unpack-objects" behaves as expected, not the OS-specific question of whether we actually were able to use the "bulk" method. Signed-off-by: Ævar Arnfjörð Bjarmason <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 9dd64cb commit 3a251ba

File tree

3 files changed

+42
-9
lines changed

3 files changed

+42
-9
lines changed

t/t0212/parse_events.perl

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -216,12 +216,19 @@
216216

217217
elsif ($event eq 'data') {
218218
my $cat = $line->{'category'};
219-
if ($cat eq 'test_category') {
220-
221-
my $key = $line->{'key'};
222-
my $value = $line->{'value'};
223-
$processes->{$sid}->{'data'}->{$cat}->{$key} = $value;
224-
}
219+
my $key = $line->{'key'};
220+
my $value = $line->{'value'};
221+
$processes->{$sid}->{'data'}->{$cat}->{$key} = $value;
222+
}
223+
224+
elsif ($event eq 'data_json') {
225+
# NEEDSWORK: Ignore due to
226+
# compat/win32/trace2_win32_process_info.c, which should log a
227+
# "cmd_ancestry" event instead.
228+
}
229+
230+
else {
231+
push @{$processes->{$sid}->{$event}} => $line->{value};
225232
}
226233

227234
# This trace2 target does not emit 'printf' events.

t/t5351-unpack-large-objects.sh

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,33 @@ test_expect_success 'unpack big object in stream' '
4848
test_dir_is_empty dest.git/objects/pack
4949
'
5050

51+
check_fsync_events () {
52+
local trace="$1" &&
53+
shift &&
54+
55+
cat >expect &&
56+
sed -n \
57+
-e '/^{"event":"data",.*"category":"fsync",/ {
58+
s/.*"category":"fsync",//;
59+
s/}$//;
60+
p;
61+
}' \
62+
<"$trace" >actual &&
63+
test_cmp expect actual
64+
}
65+
5166
BATCH_CONFIGURATION='-c core.fsync=loose-object -c core.fsyncmethod=batch'
5267

5368
test_expect_success 'unpack big object in stream (core.fsyncmethod=batch)' '
5469
prepare_dest 1m &&
5570
GIT_TRACE2_EVENT="$(pwd)/trace2.txt" \
71+
GIT_TEST_FSYNC=true \
5672
git -C dest.git $BATCH_CONFIGURATION unpack-objects <pack-$PACK.pack &&
57-
grep fsync/hardware-flush trace2.txt &&
73+
check_fsync_events trace2.txt <<-\EOF &&
74+
"key":"fsync/writeout-only","value":"6"
75+
"key":"fsync/hardware-flush","value":"1"
76+
EOF
77+
5878
test_dir_is_empty dest.git/objects/pack &&
5979
git -C dest.git cat-file --batch-check="%(objectname)" <obj-list >current &&
6080
cmp obj-list current

wrapper.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -616,10 +616,16 @@ int git_fsync(int fd, enum fsync_action action)
616616
}
617617
}
618618

619+
static void log_trace_fsync_if(const char *key, intmax_t value)
620+
{
621+
if (value)
622+
trace2_data_intmax("fsync", the_repository, key, value);
623+
}
624+
619625
void trace_git_fsync_stats(void)
620626
{
621-
trace2_data_intmax("fsync", the_repository, "fsync/writeout-only", count_fsync_writeout_only);
622-
trace2_data_intmax("fsync", the_repository, "fsync/hardware-flush", count_fsync_hardware_flush);
627+
log_trace_fsync_if("fsync/writeout-only", count_fsync_writeout_only);
628+
log_trace_fsync_if("fsync/hardware-flush", count_fsync_hardware_flush);
623629
}
624630

625631
static int warn_if_unremovable(const char *op, const char *file, int rc)

0 commit comments

Comments
 (0)