unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
       [not found] <5feaf98365b55_3f903d428113941@emba.gnu.org.mail>
@ 2020-12-29 15:50 ` Michael Albinus
  2020-12-29 17:12   ` Robert Pluim
  0 siblings, 1 reply; 14+ messages in thread
From: Michael Albinus @ 2020-12-29 15:50 UTC (permalink / raw)
  To: Robert Pluim; +Cc: emacs-devel

Hi Robert,

process-tests.el fail regularly on emba.gnu.org. They timeout, see the
last link in this reply.

Maybe it is something similar to what you have fixed for hydra tests, a
while ago?

Could you have a look on this?

Thanks, and best regards, Michael.

> Your pipeline has failed.
>
> Project: emacs ( https://emba.gnu.org/emacs/emacs )
> Branch: master ( https://emba.gnu.org/emacs/emacs/-/commits/master )
>
> Commit: ee0e259e ( https://emba.gnu.org/emacs/emacs/-/commit/ee0e259e5d52749999be329afa9c764a8aff0531 )
> Commit Message: Add some tests for align.el
>
> Commit Author: Lars Ingebrigtsen
>
> Pipeline #8399 ( https://emba.gnu.org/emacs/emacs/-/pipelines/8399 ) triggered by EMBA bot ( https://emba.gnu.org/bot )
> had 1 failed build.
>
> Job #9616 ( https://emba.gnu.org/emacs/emacs/-/jobs/9616/raw )
>
> Stage: test
> Name: test-all



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2020-12-29 15:50 ` emacs | Pipeline #8399 has failed for master | ee0e259e Michael Albinus
@ 2020-12-29 17:12   ` Robert Pluim
  2020-12-29 17:42     ` Michael Albinus
  0 siblings, 1 reply; 14+ messages in thread
From: Robert Pluim @ 2020-12-29 17:12 UTC (permalink / raw)
  To: Michael Albinus; +Cc: emacs-devel

Michael Albinus <michael.albinus@gmx.de> writes:

> Hi Robert,
>
> process-tests.el fail regularly on emba.gnu.org. They timeout, see the
> last link in this reply.
>
> Maybe it is something similar to what you have fixed for hydra tests, a
> while ago?
>

Youʼre thinking of changes for when thereʼs no network connection?

> Could you have a look on this?
>

Is there a way to get src/process-tests.log? That would at least
narrow it down.

Robert



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2020-12-29 17:12   ` Robert Pluim
@ 2020-12-29 17:42     ` Michael Albinus
  2020-12-29 21:23       ` Michael Albinus
  0 siblings, 1 reply; 14+ messages in thread
From: Michael Albinus @ 2020-12-29 17:42 UTC (permalink / raw)
  To: Robert Pluim; +Cc: emacs-devel

Robert Pluim <rpluim@gmail.com> writes:

Hi Robert,

> Is there a way to get src/process-tests.log? That would at least
> narrow it down.

No, the whole CI job runs into a timeout. I have wrapped now all tests
in process-tests.el with a timeout of 60 seconds; hopefully it shows us
the log file in case of.

> Robert

Best regards, Michael.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2020-12-29 17:42     ` Michael Albinus
@ 2020-12-29 21:23       ` Michael Albinus
  2021-01-04 17:20         ` Robert Pluim
  0 siblings, 1 reply; 14+ messages in thread
From: Michael Albinus @ 2020-12-29 21:23 UTC (permalink / raw)
  To: Robert Pluim; +Cc: emacs-devel

Hi Robert,

>> Is there a way to get src/process-tests.log? That would at least
>> narrow it down.
>
> No, the whole CI job runs into a timeout. I have wrapped now all tests
> in process-tests.el with a timeout of 60 seconds; hopefully it shows us
> the log file in case of.

See <https://emba.gnu.org/emacs/emacs/-/jobs/9636/raw>.
process-test-sentinel-sit-for has produced a failure. And according to
the timestamps, process-test-stderr-buffer ran into the timeout.

>> Robert

Best regards, Michael.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2020-12-29 21:23       ` Michael Albinus
@ 2021-01-04 17:20         ` Robert Pluim
  2021-01-04 20:38           ` Philipp Stephani
  0 siblings, 1 reply; 14+ messages in thread
From: Robert Pluim @ 2021-01-04 17:20 UTC (permalink / raw)
  To: Michael Albinus; +Cc: emacs-devel

Michael Albinus <michael.albinus@gmx.de> writes:

> Hi Robert,
>
>>> Is there a way to get src/process-tests.log? That would at least
>>> narrow it down.
>>
>> No, the whole CI job runs into a timeout. I have wrapped now all tests
>> in process-tests.el with a timeout of 60 seconds; hopefully it shows us
>> the log file in case of.
>
> See <https://emba.gnu.org/emacs/emacs/-/jobs/9636/raw>.
> process-test-sentinel-sit-for has produced a failure. And according to
> the timestamps, process-test-stderr-buffer ran into the timeout.
>

process-test-sentinel-wait-function-working-p which is used by
process-test-sentinel-sit-for looks racy. Just because the process
sentinel has been called is no guarantee that the process has exited
and had its process-status set correctly, perhaps it should loop on
'process-live-p'

The process-test-stderr-buffer timeout I can't explain: nothing there
can wait longer than 2 seconds (unless itʼs 'make-process' thatʼs
timing out?)

Robert



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2021-01-04 17:20         ` Robert Pluim
@ 2021-01-04 20:38           ` Philipp Stephani
  2021-01-05  7:52             ` Michael Albinus
  2021-01-05  9:42             ` Robert Pluim
  0 siblings, 2 replies; 14+ messages in thread
From: Philipp Stephani @ 2021-01-04 20:38 UTC (permalink / raw)
  To: Emacs developers; +Cc: Michael Albinus

Am Mo., 4. Jan. 2021 um 18:21 Uhr schrieb Robert Pluim <rpluim@gmail.com>:
>
> Michael Albinus <michael.albinus@gmx.de> writes:
>
> > Hi Robert,
> >
> >>> Is there a way to get src/process-tests.log? That would at least
> >>> narrow it down.
> >>
> >> No, the whole CI job runs into a timeout. I have wrapped now all tests
> >> in process-tests.el with a timeout of 60 seconds; hopefully it shows us
> >> the log file in case of.
> >
> > See <https://emba.gnu.org/emacs/emacs/-/jobs/9636/raw>.
> > process-test-sentinel-sit-for has produced a failure. And according to
> > the timestamps, process-test-stderr-buffer ran into the timeout.
> >
>
> process-test-sentinel-wait-function-working-p which is used by
> process-test-sentinel-sit-for looks racy. Just because the process
> sentinel has been called is no guarantee that the process has exited
> and had its process-status set correctly, perhaps it should loop on
> 'process-live-p'

AFAIK the only correct way to wait for a process to exit is (while
(accept-process-output PROC)).

>
> The process-test-stderr-buffer timeout I can't explain: nothing there
> can wait longer than 2 seconds (unless itʼs 'make-process' thatʼs
> timing out?)

make-process can in theory deadlock on BSD-like systems due to a race
between setting the close-on-exec flag and other fork+exec
combinations. That's rather unlikely though.
But maybe there's a race between accept-process-output and calling the
sentinel so that the sentinel is called too early, and then
accept-process-output blocks? AFAIK, when splitting stderr and stdout,
one has to wait separately for the two involved processes:
(while (accept-process-output process))
(while (accept-process-output stderr-process))



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2021-01-04 20:38           ` Philipp Stephani
@ 2021-01-05  7:52             ` Michael Albinus
  2021-01-05 13:44               ` Philipp Stephani
  2021-01-05  9:42             ` Robert Pluim
  1 sibling, 1 reply; 14+ messages in thread
From: Michael Albinus @ 2021-01-05  7:52 UTC (permalink / raw)
  To: Philipp Stephani; +Cc: Emacs developers

Philipp Stephani <p.stephani2@gmail.com> writes:

>> process-test-sentinel-wait-function-working-p which is used by
>> process-test-sentinel-sit-for looks racy. Just because the process
>> sentinel has been called is no guarantee that the process has exited
>> and had its process-status set correctly, perhaps it should loop on
>> 'process-live-p'
>
> AFAIK the only correct way to wait for a process to exit is (while
> (accept-process-output PROC)).

I vaguely remember that Stefan did propose (while (accept-process-output
PROC 0)).

Best regards, Michael.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2021-01-04 20:38           ` Philipp Stephani
  2021-01-05  7:52             ` Michael Albinus
@ 2021-01-05  9:42             ` Robert Pluim
  2021-01-05  9:55               ` Andreas Schwab
  1 sibling, 1 reply; 14+ messages in thread
From: Robert Pluim @ 2021-01-05  9:42 UTC (permalink / raw)
  To: Philipp Stephani; +Cc: Michael Albinus, Emacs developers

Philipp Stephani <p.stephani2@gmail.com> writes:

>> The process-test-stderr-buffer timeout I can't explain: nothing there
>> can wait longer than 2 seconds (unless itʼs 'make-process' thatʼs
>> timing out?)
>
> make-process can in theory deadlock on BSD-like systems due to a race
> between setting the close-on-exec flag and other fork+exec
> combinations. That's rather unlikely though.
> But maybe there's a race between accept-process-output and calling the
> sentinel so that the sentinel is called too early, and then
> accept-process-output blocks? AFAIK, when splitting stderr and stdout,
> one has to wait separately for the two involved processes:
> (while (accept-process-output process))
> (while (accept-process-output stderr-process))

The code is this:

    (while (not (or sentinel-called
		    (> (- (float-time) start-time)
		       process-test-sentinel-wait-timeout)))
      (accept-process-output))

You mean between checking 'sentinel-called' and
'accept-process-output', the sentinel is called, the process exit's and
then 'accept-process-output' hangs? I guess thatʼs possible. We could
add a timeout to accept-process-output to verify.

To your other point: thereʼs only one process involved here, stderr is
being sent to a separate buffer (although using a separate process is
possible as well).

Robert



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2021-01-05  9:42             ` Robert Pluim
@ 2021-01-05  9:55               ` Andreas Schwab
  0 siblings, 0 replies; 14+ messages in thread
From: Andreas Schwab @ 2021-01-05  9:55 UTC (permalink / raw)
  To: emacs-devel

On Jan 05 2021, Robert Pluim wrote:

> The code is this:
>
>     (while (not (or sentinel-called
> 		    (> (- (float-time) start-time)
> 		       process-test-sentinel-wait-timeout)))
>       (accept-process-output))
>
> You mean between checking 'sentinel-called' and
> 'accept-process-output', the sentinel is called, the process exit's and
> then 'accept-process-output' hangs? I guess thatʼs possible.

No, that is not possible, as the process sentinel is only called while
inside accept-process-output.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2021-01-05  7:52             ` Michael Albinus
@ 2021-01-05 13:44               ` Philipp Stephani
  2021-01-06 12:15                 ` Michael Albinus
  0 siblings, 1 reply; 14+ messages in thread
From: Philipp Stephani @ 2021-01-05 13:44 UTC (permalink / raw)
  To: Michael Albinus; +Cc: Emacs developers

Am Di., 5. Jan. 2021 um 08:52 Uhr schrieb Michael Albinus
<michael.albinus@gmx.de>:
>
> Philipp Stephani <p.stephani2@gmail.com> writes:
>
> >> process-test-sentinel-wait-function-working-p which is used by
> >> process-test-sentinel-sit-for looks racy. Just because the process
> >> sentinel has been called is no guarantee that the process has exited
> >> and had its process-status set correctly, perhaps it should loop on
> >> 'process-live-p'
> >
> > AFAIK the only correct way to wait for a process to exit is (while
> > (accept-process-output PROC)).
>
> I vaguely remember that Stefan did propose (while (accept-process-output
> PROC 0)).

I guess that would work as well, but wouldn't it result in a busy
wait? OTOH, accept-process-output with an infinite timeout should
return immediately if the process has terminated (i.e. Emacs has
processed the SIGCHLD signal).



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2021-01-05 13:44               ` Philipp Stephani
@ 2021-01-06 12:15                 ` Michael Albinus
  2021-01-17 10:37                   ` Philipp Stephani
  0 siblings, 1 reply; 14+ messages in thread
From: Michael Albinus @ 2021-01-06 12:15 UTC (permalink / raw)
  To: Philipp Stephani; +Cc: Emacs developers

Philipp Stephani <p.stephani2@gmail.com> writes:

Hi Philipp,

>> >> process-test-sentinel-wait-function-working-p which is used by
>> >> process-test-sentinel-sit-for looks racy. Just because the process
>> >> sentinel has been called is no guarantee that the process has exited
>> >> and had its process-status set correctly, perhaps it should loop on
>> >> 'process-live-p'
>> >
>> > AFAIK the only correct way to wait for a process to exit is (while
>> > (accept-process-output PROC)).
>>
>> I vaguely remember that Stefan did propose (while (accept-process-output
>> PROC 0)).
>
> I guess that would work as well, but wouldn't it result in a busy
> wait?

No. If there's no output, or the connection is closed, it shall return nil.
Well, this is also true for (while (accept-process-output PROC)), but
this could block if the process just waits for something to happen.

Sure, the process shall exit in the given test situation. But we test
*whether* it happens, and shall be prepared that it fails.

(OTOH we have wrapped now the tests with a 60 second timeout; this might
be sufficient.)

Best regards, Michael.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2021-01-06 12:15                 ` Michael Albinus
@ 2021-01-17 10:37                   ` Philipp Stephani
  2021-01-17 12:42                     ` Michael Albinus
  0 siblings, 1 reply; 14+ messages in thread
From: Philipp Stephani @ 2021-01-17 10:37 UTC (permalink / raw)
  To: Michael Albinus; +Cc: Emacs developers

Am Mi., 6. Jan. 2021 um 13:15 Uhr schrieb Michael Albinus
<michael.albinus@gmx.de>:
>
> Philipp Stephani <p.stephani2@gmail.com> writes:
>
> Hi Philipp,
>
> >> >> process-test-sentinel-wait-function-working-p which is used by
> >> >> process-test-sentinel-sit-for looks racy. Just because the process
> >> >> sentinel has been called is no guarantee that the process has exited
> >> >> and had its process-status set correctly, perhaps it should loop on
> >> >> 'process-live-p'
> >> >
> >> > AFAIK the only correct way to wait for a process to exit is (while
> >> > (accept-process-output PROC)).
> >>
> >> I vaguely remember that Stefan did propose (while (accept-process-output
> >> PROC 0)).
> >
> > I guess that would work as well, but wouldn't it result in a busy
> > wait?
>
> No. If there's no output, or the connection is closed, it shall return nil.
> Well, this is also true for (while (accept-process-output PROC)), but
> this could block if the process just waits for something to happen.

You're right in that (while (accept-process-output PROC 0)) doesn't
result in a busy wait, yes. However, since accept-process-output
returns nil in that case, it wouldn't wait at all. But these tests
(e.g. process-tests-stderr-filter) are clearly intended to wait for
process exit; they even contain assertions that the process has
exited.
I'm still convinced that (while (accept-process-output PROC)) is the
only correct way to wait for PROC to finish (see the "Accepting
Output" Info node).

> (OTOH we have wrapped now the tests with a 60 second timeout; this might
> be sufficient.)

We should never hit a timeout in these cases. These test processes
should exit immediately and never hang. Any timeout indicates a bug
either in the tests or in Emacs itself.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2021-01-17 10:37                   ` Philipp Stephani
@ 2021-01-17 12:42                     ` Michael Albinus
  2021-01-17 13:21                       ` Philipp Stephani
  0 siblings, 1 reply; 14+ messages in thread
From: Michael Albinus @ 2021-01-17 12:42 UTC (permalink / raw)
  To: Philipp Stephani; +Cc: Emacs developers

Philipp Stephani <p.stephani2@gmail.com> writes:

Hi Philipp,

> You're right in that (while (accept-process-output PROC 0)) doesn't
> result in a busy wait, yes. However, since accept-process-output
> returns nil in that case, it wouldn't wait at all. But these tests
> (e.g. process-tests-stderr-filter) are clearly intended to wait for
> process exit; they even contain assertions that the process has
> exited.
> I'm still convinced that (while (accept-process-output PROC)) is the
> only correct way to wait for PROC to finish (see the "Accepting
> Output" Info node).

I believe, (while (accept-process-output PROC 0)) is the proper way to
read pending output from an exited process. That's all.

Best regards, Michael.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: emacs | Pipeline #8399 has failed for master | ee0e259e
  2021-01-17 12:42                     ` Michael Albinus
@ 2021-01-17 13:21                       ` Philipp Stephani
  0 siblings, 0 replies; 14+ messages in thread
From: Philipp Stephani @ 2021-01-17 13:21 UTC (permalink / raw)
  To: Michael Albinus; +Cc: Emacs developers

Am So., 17. Jan. 2021 um 13:42 Uhr schrieb Michael Albinus
<michael.albinus@gmx.de>:
>
> Philipp Stephani <p.stephani2@gmail.com> writes:
>
> Hi Philipp,
>
> > You're right in that (while (accept-process-output PROC 0)) doesn't
> > result in a busy wait, yes. However, since accept-process-output
> > returns nil in that case, it wouldn't wait at all. But these tests
> > (e.g. process-tests-stderr-filter) are clearly intended to wait for
> > process exit; they even contain assertions that the process has
> > exited.
> > I'm still convinced that (while (accept-process-output PROC)) is the
> > only correct way to wait for PROC to finish (see the "Accepting
> > Output" Info node).
>
> I believe, (while (accept-process-output PROC 0)) is the proper way to
> read pending output from an exited process. That's all.

Yeah, I think you're right. However, if we'd need to wait for the
process anyway, we'd need to evaluate

(while (process-live-p PROC) (accept-process-output))
(while (accept-process-output PROC 0))

and that's more complex and subtler than (while (accept-process-output PROC)).

There's another issue that I haven't had the chance to debug yet: If
you evaluate a form like

(let ((tot-calls 0))
  (dotimes (i 100)
    (let* ((calls 0)
           (a (make-process :name "a"
                            :command (list "bash" "-c" "echo out &&
echo err >&2")
                            :stderr (generate-new-buffer "*stderr*")
                            :sentinel (lambda (_a _b) (cl-incf calls))
                            :noquery t)))
      (while (accept-process-output a))
      (cl-incf tot-calls calls)))
  tot-calls)

then the result will often be significantly less than 100, and I think
Emacs should guarantee that it will be exactly 100 (i.e. that the
sentinel is guaranteed to be called once accept-process-output returns
nil).



^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2021-01-17 13:21 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <5feaf98365b55_3f903d428113941@emba.gnu.org.mail>
2020-12-29 15:50 ` emacs | Pipeline #8399 has failed for master | ee0e259e Michael Albinus
2020-12-29 17:12   ` Robert Pluim
2020-12-29 17:42     ` Michael Albinus
2020-12-29 21:23       ` Michael Albinus
2021-01-04 17:20         ` Robert Pluim
2021-01-04 20:38           ` Philipp Stephani
2021-01-05  7:52             ` Michael Albinus
2021-01-05 13:44               ` Philipp Stephani
2021-01-06 12:15                 ` Michael Albinus
2021-01-17 10:37                   ` Philipp Stephani
2021-01-17 12:42                     ` Michael Albinus
2021-01-17 13:21                       ` Philipp Stephani
2021-01-05  9:42             ` Robert Pluim
2021-01-05  9:55               ` Andreas Schwab

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).