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

Reply via email to