Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[SOLVED] Problem using s6-notifyoncheck in an s6 service
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Portage & Programming
View previous topic :: View next topic  
Author Message
flexibeast
Guru
Guru


Joined: 04 Apr 2022
Posts: 473
Location: Naarm/Melbourne, Australia

PostPosted: Mon Nov 11, 2024 2:33 am    Post subject: [SOLVED] Problem using s6-notifyoncheck in an s6 service Reply with quote

[Administrator note: this post was originally in to the topic splitdebug not working due to path issue, but the post author subsequently requested that it be moved to its own thread. -Hu]

GDH-gentoo wrote:
You mean that you ran s6-notifyoncheck from a shell? If yes, that is not going to work, it needs to inherit the writing end of the readiness notification pipe from s6-supervise, and the number read from the notification-fd file has to match its file descriptor.

Ah, yeah, indeed - thanks!

GDH-gentoo wrote:
Therefore, it only makes sense to call s6-notifyoncheck from the run script in the service directory (or s6-rc longrun definition directory).

i'm not working with s6-rc at this point; that'll be something i do the next stage.

Fundamentally, here are the things i'm trying to achieve:

* Learn how to set up pure s6 services before moving to learning how to set up s6-rc services. i've read the s6 and s6-rc documentation - not least because i'm the person who's ported the documentation for both to mdoc(7) :-) - but putting the pieces together is another issue. And i want to do this for two reasons:

* i want to write short, focused-on-necessities-only guides to help people understand set up s6 / s6-rc services, using concrete information - i.e. not just "set up some path", but "set up some path, such as /what/ever, which we'll use in subsequent examples". i've not encountered many / any such guides; instead, i feel like the amount of detail typically provided - as well as the use of execline, even though it's not actually obligatory - is overwhelming and obscuring the simplicity of the core, which i feel in turn discourages people from trying to use s6 and s6-rc. Here's what i've got so far, which is just about using s6-supervise. i want to expand that to including setting up a pure s6 service, and then to expand that to include setting up a scandir, and then to include setting up an s6-rc service, and then to setting up s6-rc more generally.

* Ultimately, i want to set up s6-rc user services on my own box. :-)

The problem i'm having with my Emacs service is that i want to indicate readiness once the server is able to accept requests from emacsclient. The way i'm trying to do this is to have ~/s6/emacs/data/check contain:

Code:
#!/bin/dash

exec emacsclient -e '(if server-mode t)'

which returns 1 until the emacsclient command succeeds, at which point it returns 0.

My ~/s6/emacs/run file contains:

Code:
export DBUS_SESSION_BUS_ADDRESS=$(cat "${XDG_STATE_HOME}/session-bus-address" | tr -d '\n')

s6-notifyoncheck /usr/bin/emacs --fg-daemon 1>>"${HOME}/.logs/emacs.log" 2>&1

But testing shows that as far as s6 is concerned, the service is ready almost immediately - when the reality is, with my config, it takes several seconds for the server to get to a state where an emacsclient command succeeds.

i'm almost certain i'm doing something wrong here - or not doing something right - but i can't figure out what, and how to isolate the problem. So, suggestions welcome :-) - although probably in a new discussion thread, i guess.

[Administrator edit: Changed quote blocks from [quote="GDH-gentoo"] to [quote="GDH-gentoo"] to maintain connectivity to the original post, since this post is now in a separate thread. -Hu]
_________________
https://wiki.gentoo.org/wiki/User:Flexibeast


Last edited by flexibeast on Sun Nov 24, 2024 1:41 am; edited 1 time in total
Back to top
View user's profile Send private message
GDH-gentoo
Veteran
Veteran


Joined: 20 Jul 2019
Posts: 1719
Location: South America

PostPosted: Mon Nov 11, 2024 12:49 pm    Post subject: Re: Problem using s6-notifyoncheck in an s6 service Reply with quote

flexibeast wrote:
~/s6/emacs/data/check contain:

Code:
#!/bin/dash

exec emacsclient -e '(if server-mode t)'

which returns 1 until the emacsclient command succeeds, at which point it returns 0.

My ~/s6/emacs/run file contains:

Code:
export DBUS_SESSION_BUS_ADDRESS=$(cat "${XDG_STATE_HOME}/session-bus-address" | tr -d '\n')

s6-notifyoncheck /usr/bin/emacs --fg-daemon 1>>"${HOME}/.logs/emacs.log" 2>&1


But testing shows that as far as s6 is concerned, the service is ready almost immediately - when the reality is, with my config, it takes several seconds for the server to get to a state where an emacsclient command succeeds.

I'm familiar with the s6 ecosystem, but not with Emacs. From the s6 side, the setup looks mostly correct to me, except that the run script should likely end with exec s6-notifyoncheck.

From the Emacs side, I don't know if emacsclient -e '(if server-mode t)' is a good polling mechanism; judging by your description of its exit codes, and assuming that it exits immediately, it appears to be.

So, the problem here is that s6-supervise claims that the service is ready before you believe that it actually is? How do you determine that? The difference between the "up" and "ready" timestamps in the output of s6-svstat is too short? s6-svc -uwU returns too soon?
_________________
NeddySeagoon wrote:
I'm not a witch, I'm a retired electronics engineer :)
Ionen wrote:
As a packager I just don't want things to get messier with weird build systems and multiple toolchains requirements though :)
Back to top
View user's profile Send private message
flexibeast
Guru
Guru


Joined: 04 Apr 2022
Posts: 473
Location: Naarm/Melbourne, Australia

PostPosted: Thu Nov 21, 2024 8:38 am    Post subject: Reply with quote

Finally coming back to this; sorry for having taken so long to reply!

i prepended exec to the last line of the run file.

My test setup is this:

  • i have two terminal windows open. In the first, i type

    Code:
    $ s6-supervise ~/s6/emacs

    without yet pressing ENTER. In the second, i type

    Code:
    $ s6-svstat ~/s6/emacs && emacsclient -c

    again without yet pressing ENTER.

  • i focus the first window, press ENTER, and then immediately switch to the other window and press ENTER.

The result in the second window is:

Code:
$ s6-svstat ~/s6/emacs && emacsclient -c
up (pid 4338 pgid 4338) 0 seconds
emacsclient: can't find socket; have you started the server?
emacsclient: To start the server in Emacs, type "M-x server-start".
emacsclient: No socket or alternate editor.  Please use:

   --socket-name
   --server-file      (or environment variable EMACS_SERVER_FILE)
   --alternate-editor (or environment variable ALTERNATE_EDITOR)

So it's saying it's "up" even though the server is still in the process of starting up, which takes several seconds. Once the server is running and actually accepting connections, the output of calling `emacsclient -c` is:

Code:
$ emacsclient -c
Waiting for Emacs...

_________________
https://wiki.gentoo.org/wiki/User:Flexibeast
Back to top
View user's profile Send private message
GDH-gentoo
Veteran
Veteran


Joined: 20 Jul 2019
Posts: 1719
Location: South America

PostPosted: Thu Nov 21, 2024 12:41 pm    Post subject: Reply with quote

flexibeast wrote:
The result in the second window is:

Code:
$ s6-svstat ~/s6/emacs && emacsclient -c
up (pid 4338 pgid 4338) 0 seconds
...

So it's saying it's "up" even though the server is still in the process of starting up, which takes several seconds.

That's expected, and correct :) When s6-svstat says "up", it only means that s6-supervise started the service —that is, executed the run file—. If you enable readiness notification by creating a notification-fd file, the output changes to something like:

Code:
up (pid 4338 pgid 4338) xxx seconds, ready xxx seconds

when the service is up and ready. Note that your output does not show a "ready" timestamp, so emacs was not ready yet (according to your poller).

Change the command in your second window to:

Code:
$ s6-svwait -U ~/s6/emacs && s6-svstat ~/s6/emacs && emacsclient -c

_________________
NeddySeagoon wrote:
I'm not a witch, I'm a retired electronics engineer :)
Ionen wrote:
As a packager I just don't want things to get messier with weird build systems and multiple toolchains requirements though :)
Back to top
View user's profile Send private message
flexibeast
Guru
Guru


Joined: 04 Apr 2022
Posts: 473
Location: Naarm/Melbourne, Australia

PostPosted: Sat Nov 23, 2024 4:26 am    Post subject: Reply with quote

Changing the command in the second window to the one you specified, i.e.

Code:
$ s6-svwait -U ~/s6/emacs && s6-svstat ~/s6/emacs && emacsclient -c

results in no output in the terminal, an emacsclient instance never starting, and never getting a prompt back. However, several seconds after running that command line, i can successfully manually start an emacsclient instance by doing so outside of that window (more specifically, via a shell script i run from Wofi), so the server has started successfully. And indeed, running ~/s6/emacs/data/check manually at that point returns 0:

Code:
$ ~/s6/emacs/data/check
t
$ echo $?
0

_________________
https://wiki.gentoo.org/wiki/User:Flexibeast
Back to top
View user's profile Send private message
GDH-gentoo
Veteran
Veteran


Joined: 20 Jul 2019
Posts: 1719
Location: South America

PostPosted: Sat Nov 23, 2024 2:56 pm    Post subject: Reply with quote

flexibeast wrote:
Changing the command in the second window to the one you specified, i.e.

Code:
$ s6-svwait -U ~/s6/emacs && s6-svstat ~/s6/emacs && emacsclient -c

results in no output in the terminal, an emacsclient instance never starting, and never getting a prompt back.

Never, or several seconds later? Try:

Code:
$ s6-svwait -U -t 10000 ~/s6/emacs && s6-svstat ~/s6/emacs && emacsclient -c

and wait at least 10 seconds.

flexibeast wrote:
However, several seconds after running that command line, i can successfully manually start an emacsclient instance by doing so outside of that window (more specifically, via a shell script i run from Wofi), so the server has started successfully. And indeed, running ~/s6/emacs/data/check manually at that point returns 0:

Code:
$ ~/s6/emacs/data/check
t
$ echo $?
0

When that happens, check if the output of s6-svstat ~/s6/emacs shows the "ready xxx seconds" part. If no, check with ps if s6-notifyoncheck is still running.

Remember that s6-notifyoncheck gets tired after 7 seconds or so by default, and stops polling. Do you estimate that emacs with your settings becomes ready after more than that? If yes, you'd have to pass extra options in data/check too keep s6-notifyoncheck polling for longer.
_________________
NeddySeagoon wrote:
I'm not a witch, I'm a retired electronics engineer :)
Ionen wrote:
As a packager I just don't want things to get messier with weird build systems and multiple toolchains requirements though :)
Back to top
View user's profile Send private message
flexibeast
Guru
Guru


Joined: 04 Apr 2022
Posts: 473
Location: Naarm/Melbourne, Australia

PostPosted: Sat Nov 23, 2024 10:54 pm    Post subject: Reply with quote

It hadn't returned after several minutes.

When i run:

Code:
$ s6-svwait -U -t 10000 ~/s6/emacs && s6-svstat ~/s6/emacs && emacsclient -c


i get:

Code:
s6-svwait: fatal: timed out

However, i can successfully manually start emacsclient about 5-6 seconds after running the above command, and at any time thereafter (i.e. the emacs server is not crashing - once it's started, it stays running).
_________________
https://wiki.gentoo.org/wiki/User:Flexibeast
Back to top
View user's profile Send private message
GDH-gentoo
Veteran
Veteran


Joined: 20 Jul 2019
Posts: 1719
Location: South America

PostPosted: Sun Nov 24, 2024 1:09 am    Post subject: Reply with quote

flexibeast wrote:
i get:

Code:
s6-svwait: fatal: timed out

It might be possible that the service never becomes ready from s6-supervise's point of view, so the polling mechanism should be investigated:

GDH-gentoo wrote:
flexibeast wrote:
However, several seconds after running that command line, i can successfully manually start an emacsclient instance by doing so outside of that window (more specifically, via a shell script i run from Wofi), so the server has started successfully. And indeed, running ~/s6/emacs/data/check manually at that point returns 0:

Code:
$ ~/s6/emacs/data/check
t
$ echo $?
0

When that happens, check if the output of s6-svstat ~/s6/emacs shows the "ready xxx seconds" part. If no, check with ps if s6-notifyoncheck is still running.

Remember that s6-notifyoncheck gets tired after 7 seconds or so by default, and stops polling. Do you estimate that emacs with your settings becomes ready after more than that? If yes, you'd have to pass extra options in data/check too keep s6-notifyoncheck polling for longer.

_________________
NeddySeagoon wrote:
I'm not a witch, I'm a retired electronics engineer :)
Ionen wrote:
As a packager I just don't want things to get messier with weird build systems and multiple toolchains requirements though :)
Back to top
View user's profile Send private message
flexibeast
Guru
Guru


Joined: 04 Apr 2022
Posts: 473
Location: Naarm/Melbourne, Australia

PostPosted: Sun Nov 24, 2024 1:40 am    Post subject: Reply with quote

GDH-gentoo wrote:
Remember that s6-notifyoncheck gets tired after 7 seconds or so by default, and stops polling. Do you estimate that emacs with your settings becomes ready after more than that? If yes, you'd have to pass extra options in data/check too keep s6-notifyoncheck polling for longer.

Oh, sorry i didn't address this! It turns out this was the underlying issue.

Startup is actually taking a bit longer than 7 seconds (8 seconds on one run). On top of that, i'd misunderstood the s6-notifyoncheck docs; i hadn't put together that the default value of 7 for `-n`, combined with a default value of 1000 for `-w`, creates a 7 second timeout.

So what i've done is modify the run script to pass `-n 20` as an option to `s6-notifyoncheck`, which is obviously more than i strictly need, but i'd rather err on the side of caution at this point, and 20 seconds doesn't seem an excessively long grace period ....

Thanks for your help and your patience in working through this with me!
_________________
https://wiki.gentoo.org/wiki/User:Flexibeast
Back to top
View user's profile Send private message
GDH-gentoo
Veteran
Veteran


Joined: 20 Jul 2019
Posts: 1719
Location: South America

PostPosted: Sun Nov 24, 2024 3:11 am    Post subject: Reply with quote

flexibeast wrote:
On top of that, i'd misunderstood the s6-notifyoncheck docs; i hadn't put together that the default value of 7 for `-n`, combined with a default value of 1000 for `-w`, creates a 7 second timeout.

Yes, this is the exact reason.

flexibeast wrote:
Thanks for your help and your patience in working through this with me!

I'm glad that I could help.
_________________
NeddySeagoon wrote:
I'm not a witch, I'm a retired electronics engineer :)
Ionen wrote:
As a packager I just don't want things to get messier with weird build systems and multiple toolchains requirements though :)
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Portage & Programming All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum