git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v4 3/4] Makefile/coccicheck: allow for setting xargs concurrency

From
Jeff King <peff@peff.net>
Date
Mar 26, 2021, 04:11 UTC
Message-ID
<YF1e9mIQUKEOPSbn@coredump.intra.peff.net>
In-Reply-To
<877dlwotjc.fsf@evledraar.gmail.com>
On Thu, Mar 25, 2021 at 03:29:11AM +0100, Ævar Arnfjörð Bjarmason wrote:
Show 17 quoted lines
> > I don't understand this 9999 comment. The original was sometimes setting
> > $limit to the empty string, and then doing:
> >
> >  xargs $limit
> >
> > How is that any different than setting SPATCH_XARGS to just "xargs" for
> > the unlimited case?
> 
> The "over multiple lines" is important. But it seems not
> anymore. I.e. in an earlier version I had:
> 
>     $(XARGS) \
>         $(XARGS_FLAGS) \
>         $(SPATCH)
> 
> And it would brek if XARGS_FLAGS was empty. So I set it to -n 9999 as a
> fallback.

Ah, OK, that makes more sense. Though I'm still slightly confused, just because I think the Makefile will eat those backslashed newlines, and the shell will just see extra whitespace. I.e.:

  $ cat Makefile
  foo:
  	echo \
  		$(A) \
  		$(B) \
  		$(C)
  $ make foo A=one C=three
  echo \
  	one \
  	 \
  	three
  one three

I suspect whatever you wrote that hit the problem was just slightly different. I doubt this is worth thinking about any further, but it is a weird curiosity to me. So feel free to explore and respond if you find it interesting, but don't feel compelled to. :)

Show 12 quoted lines
> > As I mentioned in the last round, using "-P" is racy. I'm not sure if
> > it's something we should be recommending to people.
> 
> Yes, this would need to use N tempfiles we'd cat together at the end to
> be POSIX-reliable.
> 
> In practice I've never seen this sort of thing be unreliable for a case
> like this.
> 
> POSIX just guarantees that the output won't be interleaved up to
> PIPE_BUF, which is typically 4k. We certainly get patches bigger than
> that from spatch in some cases.

One nit (because I spent quite a long time looking into this a while ago for an unrelated thing): POSIX only talks about PIPE_BUF for pipes. For regular files in O_APPEND mode (or two processes sharing a descriptor from their parent, as we'd have here), I think write() is allowed to do a short write, at which point you'd lose atomicity.

In practice, I'd expect most small-ish (say, less than a page) writes to happen in a single go, especially on modern operating systems. But I wouldn't be too surprised if it depends on details of the filesystem, or even the file you're writing into. E.g., if there are 20 bytes left in a filesystem block that the end of the file is currently pointing to, and you ask to write 30 bytes, it seems plausible that we might write the first 20 to fill out the block, and then have a point where we could get interrupted by a signal and return early, etc.

> But from the OS's perspective emitting this output happens at a glacial
> pace. So even if it crosses that boundary it's unlikely to be
> interleaved.

Yes, I think even if it's possible to race, the general lack of volume of writes is likely to save us.

Everything below is more curiosity, so again, don't sink time into it if it's not an interesting tangent for you.

Show 18 quoted lines
> Even:
> 
>     perl -wE 'print "a" for 1..1024*1024*100' >1
>     perl -wE 'print "b" for 1..1024*1024*100' >2
>     perl -wE 'print "\n" for 1..1024*1024*100' >3
>     $ du -shc 1 2 3
>     100M    1
>     100M    2
>     100M    3
>     300M    total
> 
> Which at least on this computer I can't get to not print:
> 
>     $ echo 1 2 3 | xargs -P 3 -n 1 cat|wc -l
>     104857600
> 
> Suggesting that even for output of that size the \n's aren't mixed
> up. YMMV.
I don't think this is telling us much, for two reasons:
  - it's a pipe, not a file, so PIPE_BUF _does_ count here
  - "wc -l" is counting the number of newlines, which always will be the
    same, whether there are interleaved blocks or not. The interesting
    thing is whether a single write() from one of the "cat" calls is
    interleaved with another, but we can't tell that without knowing how
    big a block cat is using.
A more interesting test is something like:
  for i in a b c; do
    perl -e '
      syswrite(STDOUT,"this is $ARGV[0]\n") for 1..1024*1024*10
    ' $i &
  done >out
  wait
  sort <out | uniq -c

We are writing to a shared file here, and we care whether each individual syswrite ever got interleaved with another (which we would notice because our sort/uniq output would have more than the expected three lines).

We can even spice it up with some signals on one of the processes by putting:

  $SIG{ALRM} = sub { print STDERR "alarm $ARGV[0]\n" };
into the perl, and then doing:
  for t in $(seq 1000); do
    kill -ALRM %1
    sleep 0.01
  done

before the wait. But at least on Linux (with ext4), that seems to always produce atomic results for each write(). Even if I increase the size of the message to 4k or larger.

So it seems pretty solid there, but I'm not sure I would guarantee it on other platforms or filesystems.

-Peff
Previous: Ævar Arnfjörð BjarmasonNext: Junio C Hamano
Message 80 of 103 in “*.h: remove extern from function declarations”
  1. *.h: remove extern from function declarationsDenton Liu, Apr 12, 2019
  2. Jeff KingApr 13, 2019
  3. Junio C HamanoApr 13, 2019
  4. 0/3 remove extern from function declarationsDenton Liu, Apr 15, 2019
  5. 2/3 *.[ch]: remove extern from function declarations using sedDenton Liu, Apr 15, 2019
  6. 3/3 cocci: prevent extern function declarationsDenton Liu, Apr 15, 2019
  7. 1/3 *.[ch]: remove extern from function declarations using spatchDenton Liu, Apr 15, 2019
  8. Thomas GummererApr 15, 2019
  9. 0/4 remove extern from function declarationsDenton Liu, Apr 17, 2019
  10. 2/4 *.[ch]: remove extern from function declarations using sedDenton Liu, Apr 17, 2019
  11. 1/4 *.[ch]: remove extern from function declarations using spatchDenton Liu, Apr 17, 2019
  12. 4/4 cocci: prevent extern function declarationsDenton Liu, Apr 17, 2019
  13. 3/4 *.[ch]: manually align parameter listsDenton Liu, Apr 17, 2019
  14. cache.h: fix mismerge of 'dl/no-extern-in-func-decl'Denton Liu, Apr 22, 2019
  15. Junio C HamanoApr 22, 2019
  16. Junio C HamanoApr 22, 2019
  17. Jeff KingApr 22, 2019
  18. SZEDER GáborApr 25, 2019
  19. Denton LiuApr 25, 2019
  20. Johannes SchindelinApr 30, 2019
  21. Denton LiuMay 1, 2019
  22. Jeff KingMay 1, 2019
  23. SZEDER GáborMay 2, 2019
  24. Johannes SchindelinMay 3, 2019
  25. SZEDER GáborMay 3, 2019
  26. SZEDER GáborMay 3, 2019
  27. Jeff KingMay 3, 2019
  28. SZEDER GáborMay 3, 2019
  29. Junio C HamanoMay 5, 2019
  30. Jacob KellerMay 5, 2019
  31. Jacob KellerMay 5, 2019
  32. coccicheck: optionally process every source file at onceJeff King, May 6, 2019
  33. Duy NguyenMay 6, 2019
  34. coccicheck: optionally batch spatch invocationsJeff King, May 6, 2019
  35. Jacob KellerMay 7, 2019
  36. Jeff KingMay 7, 2019
  37. Junio C HamanoMay 7, 2019
  38. Jeff KingMay 7, 2019
  39. Jacob KellerMay 7, 2019
  40. Junio C HamanoMay 7, 2019
  41. Jeff KingMay 8, 2019
  42. Denton LiuMay 8, 2019
  43. Jeff KingMay 8, 2019
  44. Duy NguyenMay 7, 2019
  45. SZEDER GáborMay 7, 2019
  46. Makefile: fix bugs in coccicheck and speed it upÆvar Arnfjörð Bjarmason, Mar 2, 2021
  47. Ævar Arnfjörð BjarmasonMar 3, 2021
  48. Denton LiuMar 3, 2021
  49. Junio C HamanoMar 4, 2021
  50. Ævar Arnfjörð BjarmasonMar 5, 2021
  51. Jeff KingMar 5, 2021
  52. Ævar Arnfjörð BjarmasonMar 5, 2021
  53. Jeff KingMar 6, 2021
  54. 1/4 Makefile/coccicheck: add comment heading for all SPATCH flagsÆvar Arnfjörð Bjarmason, Mar 5, 2021
  55. 0/4 Makefile/coccicheck: fix bugs and speed it upÆvar Arnfjörð Bjarmason, Mar 5, 2021
  56. René Scharfe.Mar 5, 2021
  57. Ævar Arnfjörð BjarmasonMar 6, 2021
  58. René Scharfe.Mar 6, 2021
  59. Ævar Arnfjörð BjarmasonMar 6, 2021
  60. René Scharfe.Mar 6, 2021
  61. 3/4 Makefile/coccicheck: allow for setting xargs concurrencyÆvar Arnfjörð Bjarmason, Mar 5, 2021
  62. Jeff KingMar 6, 2021
  63. 4/4 Makefile/coccicheck: set SPATCH_BATCH_SIZE to 8Ævar Arnfjörð Bjarmason, Mar 5, 2021
  64. 5/4 Makefile/coccicheck: use --include-headers-for-typesÆvar Arnfjörð Bjarmason, Mar 6, 2021
  65. SZEDER GáborMar 18, 2021
  66. Ævar Arnfjörð BjarmasonMar 19, 2021
  67. 0/4 Makefile/coccicheck: fix bugs and speed it upÆvar Arnfjörð Bjarmason, Mar 22, 2021
  68. 1/4 Makefile/coccicheck: add comment heading for all SPATCH flagsÆvar Arnfjörð Bjarmason, Mar 22, 2021
  69. René Scharfe.Mar 22, 2021
  70. 4/4 Makefile/coccicheck: set SPATCH_BATCH_SIZE to 8Ævar Arnfjörð Bjarmason, Mar 22, 2021
  71. René Scharfe.Mar 22, 2021
  72. Jeff KingMar 24, 2021
  73. 2/4 Makefile/coccicheck: speed up and fix bug with duplicate hunksÆvar Arnfjörð Bjarmason, Mar 22, 2021
  74. René Scharfe.Mar 22, 2021
  75. Jeff KingMar 24, 2021
  76. Junio C HamanoMar 22, 2021
  77. 3/4 Makefile/coccicheck: allow for setting xargs concurrencyÆvar Arnfjörð Bjarmason, Mar 22, 2021
  78. Jeff KingMar 24, 2021
  79. Ævar Arnfjörð BjarmasonMar 25, 2021
  80. Jeff KingMar 26, 2021
  81. Junio C HamanoMar 27, 2021
  82. Ævar Arnfjörð BjarmasonMar 27, 2021
  83. 2/4 Makefile/coccicheck: speed up and fix bug with duplicate hunksÆvar Arnfjörð Bjarmason, Mar 5, 2021
  84. Jeff KingMar 6, 2021
  85. Ævar Arnfjörð BjarmasonMar 6, 2021
  86. Denton LiuMay 3, 2019
  87. 0/4 remove extern from function declarationsDenton Liu, Apr 23, 2019
  88. 2/4 *.[ch]: remove extern from function declarations using sedDenton Liu, Apr 23, 2019
  89. Junio C HamanoApr 24, 2019
  90. Denton LiuApr 25, 2019
  91. 3/4 *.[ch]: manually align parameter listsDenton Liu, Apr 23, 2019
  92. 4/4 cocci: prevent extern function declarationsDenton Liu, Apr 23, 2019
  93. 1/4 *.[ch]: remove extern from function declarations using spatchDenton Liu, Apr 23, 2019
  94. 0/3 *** SUBJECT HERE ***Denton Liu, Apr 29, 2019
  95. 2/3 *.[ch]: remove extern from function declarations using sedDenton Liu, Apr 29, 2019
  96. 1/3 *.[ch]: remove extern from function declarations using spatchDenton Liu, Apr 29, 2019
  97. 3/3 *.[ch]: manually align parameter listsDenton Liu, Apr 29, 2019
  98. Denton LiuApr 29, 2019
  99. Ævar Arnfjörð BjarmasonMay 6, 2019
  100. Denton LiuMay 6, 2019
  101. René Scharfe.Mar 6, 2021
  102. René Scharfe.Mar 6, 2021
  103. René Scharfe.Mar 13, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.