Re: [PATCH] svc_run: make sure only one svc_run loop runs in one process

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sorry for the delay.... 

On 5/15/19 10:55 PM, Xiubo Li wrote:
> Hey ping.
> 
> What's the state of this patch and will it make sense here?
I'm not sure it does make sense.... Shouldn't the mutex lock
be in the call of svc_run()?

steved.

> 
> Thanks
> BRs
> 
> On 2019/4/9 19:37, xiubli@xxxxxxxxxx wrote:
>> From: Xiubo Li <xiubli@xxxxxxxxxx>
>>
>> In gluster-block project and there are 2 separate threads, both
>> of which will run the svc_run loop, this could work well in glibc
>> version, but in libtirpc we are hitting the random crash and stuck
>> issues.
>>
>> More detail please see:
>> https://github.com/gluster/gluster-block/pull/182
>>
>> Signed-off-by: Xiubo Li <xiubli@xxxxxxxxxx>
>> ---
>>   src/svc_run.c | 19 +++++++++++++++++++
>>   1 file changed, 19 insertions(+)
>>
>> diff --git a/src/svc_run.c b/src/svc_run.c
>> index f40314b..b295755 100644
>> --- a/src/svc_run.c
>> +++ b/src/svc_run.c
>> @@ -38,12 +38,17 @@
>>   #include <string.h>
>>   #include <unistd.h>
>>   #include <sys/poll.h>
>> +#include <syslog.h>
>> +#include <stdbool.h>
>>       #include <rpc/rpc.h>
>>   #include "rpc_com.h"
>>   #include <sys/select.h>
>>   +static bool svc_loop_running = false;
>> +static pthread_mutex_t svc_run_lock = PTHREAD_MUTEX_INITIALIZER;
>> +
>>   void
>>   svc_run()
>>   {
>> @@ -51,6 +56,16 @@ svc_run()
>>     struct pollfd *my_pollfd = NULL;
>>     int last_max_pollfd = 0;
>>   +  pthread_mutex_lock(&svc_run_lock);
>> +  if (svc_loop_running) {
>> +    pthread_mutex_unlock(&svc_run_lock);
>> +    syslog (LOG_ERR, "svc_run: svc loop is already running in current process %d", getpid());
>> +    return;
>> +  }
>> +
>> +  svc_loop_running = true;
>> +  pthread_mutex_unlock(&svc_run_lock);
>> +
>>     for (;;) {
>>       int max_pollfd = svc_max_pollfd;
>>       if (max_pollfd == 0 && svc_pollfd == NULL)
>> @@ -111,4 +126,8 @@ svc_exit()
>>       svc_pollfd = NULL;
>>       svc_max_pollfd = 0;
>>       rwlock_unlock(&svc_fd_lock);
>> +
>> +    pthread_mutex_lock(&svc_run_lock);
>> +    svc_loop_running = false;
>> +    pthread_mutex_unlock(&svc_run_lock);
>>   }
> 
> 
> 
> 
> _______________________________________________
> Libtirpc-devel mailing list
> Libtirpc-devel@xxxxxxxxxxxxxxxxxxxxx
> https://lists.sourceforge.net/lists/listinfo/libtirpc-devel



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux