yep, saw that while looking at the procd code this morning. On 29/09/2016 10:36, Lebleu Pierre wrote: > In fact, the code already exists for the method "add". > > When we call the method "set", it does a vlist_update(), instance_add() and > then vlist_flush(). > > For the method "add", it only update the PID as you said so. > > I just purpose to call the method "add" rather than "set" when we specify the > instance. > > > Pierre > > -----Original Message----- > From: John Crispin [mailto:j...@phrozen.org] > Sent: donderdag 29 september 2016 7:43 > To: Lebleu Pierre <pierre.leb...@technicolor.com>; > lede-dev@lists.infradead.org > Subject: Re: [LEDE-DEV] The procd daemon does not handle correctly the > instances > > this might actually be solvable int he scripts, will need to take a closer > look today > > John > > On 29/09/2016 07:20, John Crispin wrote: >> procd uses a vlist to store instances in. if oe changes all are >> restarted. we need to change this as per my last mail to only restart >> those that actually changed. >> >> John >> >> On 28/09/2016 15:44, Lebleu Pierre wrote: >>> Hi, >>> >>> Thank you for your answer. >>> >>> First, I am going to clarify a little bit what I am trying to do. >>> >>> I would like to have more than one instance for a given daemon (here, >>> dnsmasq). >>> I would like to stop one instance when I need. >>> I would like to start one instance without stopping the other one. >>> >>> root@LEDE:~# ps w | grep dnsmasq >>> 11633 dnsmasq 1560 S /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf.main >>> -k -x /var/run/dnsmasq/dnsmasq.main.pid >>> 11634 dnsmasq 1556 S /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf.second >>> -k -x /var/run/dnsmasq/dnsmasq.second.pid >>> 11636 root 1556 S /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf.main >>> -k -x /var/run/dnsmasq/dnsmasq.main.pid >>> 11660 root 1712 R grep dnsmasq >>> root@LEDE:~# /etc/init.d/dnsmasq start main root@LEDE:~# ps w | grep >>> dnsmasq >>> 11633 dnsmasq 1560 S /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf.main >>> -k -x /var/run/dnsmasq/dnsmasq.main.pid >>> 11636 root 1556 S /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf.main >>> -k -x /var/run/dnsmasq/dnsmasq.main.pid >>> 11715 root 1712 R grep dnsmasq >>> root@LEDE:~# /etc/init.d/dnsmasq start second root@LEDE:~# ps w | >>> grep dnsmasq >>> 11753 dnsmasq 1556 S /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf.second >>> -k -x /var/run/dnsmasq/dnsmasq.second.pid >>> 11757 root 1712 R grep dnsmasq >>> >>> As you can see, when I want to start the second instance : it starts it but >>> it also kills the first instance... >>> >>> I had a look at the procd code and it seems it does not flush the other >>> instance if we call the method "add". Am I right ? >>> >>> Regarding the procd.sh file, it seems there is a lack of something. Indeed, >>> we can call "stop myinstance" but we can't call "start myinstance". >>> >>> Here, please find my modification : >>> >>> diff --git a/package/base-files/files/etc/rc.common >>> b/package/base-files/files/etc/rc.common >>> index e0de073..8cc6e69 100755 >>> --- a/package/base-files/files/etc/rc.common >>> +++ b/package/base-files/files/etc/rc.common >>> @@ -102,9 +102,11 @@ ${INIT_TRACE:+set -x} >>> . $IPKG_INSTROOT/lib/functions/procd.sh >>> basescript=$(readlink "$initscript") >>> rc_procd() { >>> + local method="set" >>> + [ -n "$2" ] && method="add" >>> procd_open_service "$(basename ${basescript:-$initscript})" >>> "$initscript" >>> "$@" >>> - procd_close_service >>> + procd_close_service $method >>> } >>> >>> start() { >>> diff --git a/package/system/procd/files/procd.sh >>> b/package/system/procd/files/procd.sh >>> index fa6f8a9..1af9c7b 100644 >>> --- a/package/system/procd/files/procd.sh >>> +++ b/package/system/procd/files/procd.sh >>> @@ -72,11 +72,15 @@ _procd_open_service() { } >>> >>> _procd_close_service() { >>> + local method="set" >>> + [ -n "$1" ] && method="$1" >>> + >>> json_close_object >>> _procd_open_trigger >>> service_triggers >>> _procd_close_trigger >>> - _procd_ubus_call set >>> + >>> + _procd_ubus_call $method >>> } >>> >>> _procd_add_array_data() { >>> >>> >>> With this patch, it seems to work. >>> >>> Pierre >>> -----Original Message----- >>> From: John Crispin [mailto:j...@phrozen.org] >>> Sent: dinsdag 27 september 2016 17:48 >>> To: Lebleu Pierre <pierre.leb...@technicolor.com>; >>> lede-dev@lists.infradead.org >>> Subject: Re: [LEDE-DEV] The procd daemon does not handle correctly >>> the instances >>> >>> >>> >>> On 27/09/2016 17:34, Lebleu Pierre wrote: >>>> Hi all, >>>> >>>> I found a bug in the daemon process management. Indeed, when we have >>>> several instances of one daemon such as "dnsmasq" and we want to restart >>>> only one instance, the other instance is killed by procd. It seems procd >>>> updates the second instance and then, kill it. >>>> >>>> Please find the patch : >>>> diff --git a/service/service.c b/service/service.c index >>>> 0796adb..9ed07da 100644 >>>> --- a/service/service.c >>>> +++ b/service/service.c >>>> @@ -132,8 +132,6 @@ service_update(struct service *s, struct blob_attr >>>> **tb, bool add) >>>> } >>>> >>>> if (tb[SERVICE_SET_INSTANCES]) { >>>> - if (!add) >>>> - vlist_update(&s->instances); >>>> blobmsg_for_each_attr(cur, tb[SERVICE_SET_INSTANCES], rem) >>>> { >>>> service_instance_add(s, cur); >>>> } >>> >>> this bit is certainly not correct. it simply deactivates the feature for >>> all services. the actual problem is that procd stores the instances inside >>> a vlist. this has an update mechanism triggered inside >>> service_instance_update(). >>> >>> what you want to do is compare in_o and in_n and only trigger >>> instance_update() if there really was a change. if there is no change then >>> simply migrate the pid over to the new instance. >>> >>> >>>> @@ -238,7 +236,7 @@ service_handle_set(struct ubus_context *ctx, struct >>>> ubus_object *obj, >>>> int ret; >>>> >>>> blobmsg_parse(service_set_attrs, __SERVICE_SET_MAX, tb, >>>> blob_data(msg), blob_len(msg)); >>>> - cur = tb[SERVICE_ATTR_NAME]; >>>> + cur = tb[SERVICE_SET_NAME]; >>>> if (!cur) >>>> return UBUS_STATUS_INVALID_ARGUMENT; >>> >>> this is a copy paste error but luckily does not cause an error as SET and >>> ATTR both eval to 0. i have merged this part as a fix. >>> >>> John >>> >>> >>>> >>>> >>>> Regards, >>>> >>>> Pierre >>>> >>>> >>>> _______________________________________________ >>>> Lede-dev mailing list >>>> Lede-dev@lists.infradead.org >>>> http://lists.infradead.org/mailman/listinfo/lede-dev >>>>
_______________________________________________ Lede-dev mailing list Lede-dev@lists.infradead.org http://lists.infradead.org/mailman/listinfo/lede-dev