Skip to content

Fix t5516 flakiness in Visual Studio builds

Johannes Schindelin via GitGitGadget git 4 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v4 Latest1 patch 1 replyIn review
  2. v31 patch 8 repliesSuperseded
  3. v21 patch 5 repliesSuperseded
Earlier versions · 1
VersionPostedPatchesRepliesStatus
v11 patch12 repliesSuperseded

Changes in v4 from the cover letter

* Reworded the part of the commit message that talks about the need for fflush(stderr); for accuracy, as suggested by Junio.
* Simplified the flow of the prefix handling as well as providing a proper BUG message and abort()ing when the prefix is too long. Thanks Junio!

Patches in v4 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/1vreportf(): avoid relying on stdio bufferingusage.c+16 -41 reply

Reviews trailers per patch

The patch has no Reviewed-by or Acked-by.

PatchJeff KingAlexandr MiloslavskiySZEDER GáborJunio C Hamano
1/1Helped-by Helped-by Helped-by Helped-by

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes. Scroll the table sideways for all 4 reviewers.

Read the v4 thread

Cover letter [PATCH v4 0/1] Fix t5516 flakiness in Visual Studio builds

Among the flaky tests, it seems that the Azure Pipeline suffers relatively frequently from t5516 failing with the Visual Studio builds. Essentially, we grep for an error message, but that error message is produced twice, once by a fetch and once by the upload-pack spawned from it, and those error messages are usually interleaved because of MSVC runtime fprintf() idiosyncracies.

As a consequence, I have to re-run about half a dozen failed builds a day, which I would like to avoid. My plan is therefore to merge this patch into Git for Windows v2.24.0-rc2.

The commit message of this patch is based, in part, on
https://github.com/gitgitgadget/git/pull/407.

This fixes https://github.com/gitgitgadget/git/issues/240.

Changes since v3:

* Reworded the part of the commit message that talks about the need for fflush(stderr); for accuracy, as suggested by Junio.
* Simplified the flow of the prefix handling as well as providing a proper BUG message and abort()ing when the prefix is too long. Thanks Junio!

Changes since v2:

* Using write_in_full() instead of xwrite() again (to make sure that the entire message is printed).
* When vsnprintf() fails, now we at least print the prefix.
* The code to check whether prefix was too long no longer tests an inequality between pointers, but between sizes.

Changes since v1:

* Changed the oneline to be more accurate (thanks Junio).
* Improved the commit message (e.g. talking about the xwrite() function this patch uses, rather than the write_in_full() function used by an earlier iteration, thanks Gábor).
* Revamped the actual code to account for insanely long prefixes (thanks for the advice, Junio).

Johannes Schindelin (1):
vreportf(): avoid relying on stdio buffering

 usage.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

base-commit: 566a1439f6f56c2171b8853ddbca0ad3f5098770
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-428%2Fdscho%2Ffix-t5516-flakiness-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-428/dscho/fix-t5516-flakiness-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/428

Range-diff vs v3:

1: fce0894ee4 ! 1: f6d6c8122a vreportf(): avoid relying on stdio buffering

     @@ -42,9 +42,9 @@
          the error message; There is little we can do in that case, and it should
          not happen anyway.
      
     -    Also please note that we `fflush(stderr)` here to help when running in a
     -    Git Bash on Windows: in this case, `stderr` is not actually truly
     -    unbuffered, and needs the extra help.
     +    The process may have written to `stderr` and there may be something left
     +    in the buffer kept in the stdio layer. Call `fflush(stderr)` before
     +    writing the message we prepare in this function.
      
          Helped-by: Jeff King <[email protected]>
          Helped-by: Alexandr Miloslavskiy <[email protected]>
     @@ -60,12 +60,17 @@
       {
       	char msg[4096];
      -	char *p;
     -+	size_t off = strlcpy(msg, prefix, sizeof(msg));
      +	char *p, *pend = msg + sizeof(msg);
     ++	size_t prefix_len = strlen(prefix);
       
      -	vsnprintf(msg, sizeof(msg), err, params);
      -	for (p = msg; *p; p++) {
     -+	p = off < pend - msg ? msg + off : pend - 1;
     ++	if (sizeof(msg) <= prefix_len) {
     ++		fprintf(stderr, "BUG!!! too long a prefix '%s'\n", prefix);
     ++		abort();
     ++	}
     ++	memcpy(msg, prefix, prefix_len);
     ++	p = msg + prefix_len;
      +	if (vsnprintf(p, pend - p, err, params) < 0)
      +		*p = '\0'; /* vsnprintf() failed, clip at prefix */
      +
Signature · 1 line
gitgitgadget