<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Mar 28, 2014 at 12:12 PM, Brandon Black <span dir="ltr"><<a href="mailto:blblack@gmail.com" target="_blank"><span class="" style>blblack</span>@gmail.com</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div>  Given where things are at today, as best I can tell my best bet is to go down that sort of road, though, and try to clone over the cgroups memberships manually somehow during an ExecReload= command for this restart (even though it really is a restart), and leaving true reloads (SIGHUP to a running daemon) to be done from outside systemd.</div>
</div></blockquote><div><br></div><div>I've done some experimenting this evening (on a Fedora 20 system w/ <span class="" style>systemd</span>-208), playing with methods of <span class="" style>MAINPID</span> notification and how to coerce <span class="" style>ExecReload</span> into letting me do an overlapped restart.  The result is that I can make it work, but it's <span class="" style>hacky</span>.  The main thing that bothers me about it is that the mechanisms probably aren't officially supported interfaces and my methods will randomly fail on a future version of <span class="" style>systemd</span> (or a differently-configured <span class="" style>distro</span>).</div>
<div><br></div><div>To recap my results: there were primarily two things in the way of naively using <span class="" style>ExecReload</span> to trigger <span class="" style>gdnsd's</span> overlapped restart:</div><div>
<br></div><div>1) <span class="" style>gdnsd</span> wants to use <span class="" style>sd</span>_<span class="" style>notifyf</span>() to indicate the <span class="" style>MAINPID</span> switch in the new daemon, which is a descendant of the <span class="" style>ExecReload</span> process.  The <span class="" style>ExecReload</span> process doesn't get a copy of $NOTIFY_SOCKET even with <span class="" style>NotifyAccess</span>=all.  So I hacked around that by having the daemon set $NOTIFY_SOCKET for itself, to the value "@/org/<span class="" style>freedesktop</span>/systemd1/notify", which seems semi-standard for the moment.</div>
<div><br></div><div>2) <span class="" style>ExecReload</span> control processes can't become the <span class="" style>MAINPID</span> even after notification because they're not in the correct <span class="" style>cgroup</span> (or subgroup, or whatever it is that's special about most control <span class="" style>procs</span>), unlike <span class="" style>Start's</span> control process, which is in the right <span class="" style>cgroup</span> for its descendants to become <span class="" style>MAINPID</span> successfully.  This was hacked around by grabbing the basic unit name from <span class="" style>sd</span>_<span class="" style>pid</span>_get_unit() (let's call the result "$U") and then writing our <span class="" style>pid</span> to "/<span class="" style>sys</span>/<span class="" style>fs</span>/<span class="" style>cgroup</span>/<span class="" style>systemd</span>/system.slice/$U/<span class="" style>cgroup</span>.<span class="" style>procs</span>" from the new daemon before it drops root <span class="" style>privs</span> and later notifies about the <span class="" style>MAINPID</span> switch.</div>
<div><br></div><div>(And of course, re-purposing <span class="" style>ExecReload</span> isn't ideal in the first place.  It's semantically wrong and it wastes the reload verb, forcing actual reload actions to need to happen from outside of <span class="" style>systemctl</span>)</div>
<div><br></div><div>The resulting commit (which is off in a testing branch of a development branch for now, there's plenty of time to work out alternate solutions) is here:</div><div><br></div><div>https://<span class="" style>github</span>.com/<span class="" style>blblack</span>/<span class="" style>gdnsd</span>/commit/17a40b0483da7d072912169e832df31d69349440</div>
<div><br></div><div>From going through this exercise, I think I can refine my feature-plea to this: What would be ideal (well, from the limited perspective of making things easier for this one daemon) would be an <span class="" style>ExecRestart</span> (or whatever) verb which acts almost exactly like <span class="" style>ExecStart</span> (correct control group for final daemon, gets $NOTIFY_SOCKET), but has its own separate command string and doesn't <span class="" style>pre</span>-check that the service is currently considered inactive.  I don't think it would be too hard to write such a patch, but my first concern is whether such a patch is even remotely likely to be accepted, or whether there are better alternatives (other patches that could be made, or perhaps better interfaces I'm unaware of in the current code can obviate the <span class="" style>hacky</span> stuff above without any patching).</div>
</div></div></div>