[Sheepdog] Building on CentOS 5.5 x86_64

Yuriy Kohut ykohut at onapp.com
Thu Oct 14 12:20:50 CEST 2010


It seems like line endings are changed while I'm copy/paste the diff from the e-mail.
Could you please attache the diff to e-mail as separate file packed with .tar.gz.

Thanks
---
Yura

On Oct 14, 2010, at 12:44 PM, Yuriy Kohut wrote:

> I'm getting the following error while patching:
> 
> patch -p1 < sheepdog-signalfd.patch
> patching file sheep/work.c
> patch: **** malformed patch at line 6: #include <syscall.h>
> ---
> Yura
> 
> On Oct 14, 2010, at 12:17 PM, MORITA Kazutaka wrote:
> 
>> At Wed, 13 Oct 2010 17:46:57 +0300,
>> Yuriy Kohut wrote:
>>> 
>>> Got it configured.
>>> 
>>> But faced with the following issue while running 'make':
>>> ---
>>> work.c:28:28: error: linux/signalfd.h: No such file or directory
>>> work.c: In function ‘bs_thread_request_done’:
>>> work.c:169: error: array type has incomplete element type
>>> work.c:169: warning: unused variable ‘siginfo’
>>> ---
>>> 
>>> signalfd.h seems to be not kernel version 2.6.18 (default CentOS 5.5 kernel) header.
>>> 
>>> Any ideas ?
>>> 
>> 
>> Can you try the following patch?  This removes use of signalfd.
>> 
>> Kazutaka
>> 
>> ==
>> diff --git a/sheep/work.c b/sheep/work.c
>> index 8016435..5f7e96c 100644
>> --- a/sheep/work.c
>> +++ b/sheep/work.c
>> @@ -24,8 +24,6 @@
>> #include <syscall.h>
>> #include <sys/types.h>
>> #include <linux/types.h>
>> -#define _LINUX_FCNTL_H
>> -#include <linux/signalfd.h>
>> 
>> #include "list.h"
>> #include "util.h"
>> @@ -33,9 +31,6 @@
>> #include "logger.h"
>> #include "event.h"
>> 
>> -extern int signalfd(int fd, const sigset_t *mask, int flags);
>> -
>> -static int sig_fd;
>> static LIST_HEAD(worker_info_list);
>> 
>> struct work_queue {
>> @@ -67,6 +62,13 @@ struct worker_info {
>> 
>>      pthread_mutex_t startup_lock;
>> 
>> +     int command_fd[2];
>> +     int done_fd[2];
>> +
>> +     pthread_cond_t finished_cond;
>> +     struct list_head ack_list;
>> +     pthread_t ack_thread;
>> +
>>      pthread_t worker_thread[0];
>> };
>> 
>> @@ -161,36 +163,86 @@ static void work_post_done(struct work_queue *q, enum work_attr attr)
>>      }
>> }
>> 
>> +static void *bs_thread_ack_fn(void *arg)
>> +{
>> +     struct worker_info *wi = arg;
>> +     int command, ret, nr;
>> +     struct work *work;
>> +
>> +retry:
>> +     ret = read(wi->command_fd[0], &command, sizeof(command));
>> +     if (ret < 0) {
>> +             eprintf("ack pthread will be dead, %m\n");
>> +             if (errno == EAGAIN || errno == EINTR)
>> +                     goto retry;
>> +
>> +             goto out;
>> +     }
>> +
>> +     pthread_mutex_lock(&wi->finished_lock);
>> +retest:
>> +     if (list_empty(&wi->finished_list)) {
>> +             pthread_cond_wait(&wi->finished_cond, &wi->finished_lock);
>> +             goto retest;
>> +     }
>> +
>> +     while (!list_empty(&wi->finished_list)) {
>> +             work = list_first_entry(&wi->finished_list,
>> +                                     struct work, w_list);
>> +
>> +             list_del(&work->w_list);
>> +             list_add_tail(&work->w_list, &wi->ack_list);
>> +     }
>> +
>> +     pthread_mutex_unlock(&wi->finished_lock);
>> +
>> +     nr = 1;
>> +rewrite:
>> +     ret = write(wi->done_fd[1], &nr, sizeof(nr));
>> +     if (ret < 0) {
>> +             eprintf("can't ack tgtd, %m\n");
>> +             if (errno == EAGAIN || errno == EINTR)
>> +                     goto rewrite;
>> +
>> +             goto out;
>> +     }
>> +
>> +     goto retry;
>> +out:
>> +     pthread_exit(NULL);
>> +}
>> +
>> static void bs_thread_request_done(int fd, int events, void *data)
>> {
>>      int ret;
>> -     struct worker_info *wi;
>> +     struct worker_info *wi = data;
>>      struct work *work;
>> -     struct signalfd_siginfo siginfo[16];
>> -     LIST_HEAD(list);
>> +     int nr_events;
>> 
>> -     ret = read(fd, (char *)siginfo, sizeof(siginfo));
>> -     if (ret <= 0)
>> +     ret = read(wi->done_fd[0], &nr_events, sizeof(nr_events));
>> +     if (ret < 0)
>>              return;
>> 
>> -     list_for_each_entry(wi, &worker_info_list, worker_info_siblings) {
>> -             pthread_mutex_lock(&wi->finished_lock);
>> -             list_splice_init(&wi->finished_list, &list);
>> -             pthread_mutex_unlock(&wi->finished_lock);
>> +     while (!list_empty(&wi->ack_list)) {
>> +             enum work_attr attr;
>> +             work = list_first_entry(&wi->ack_list,
>> +                                     struct work, w_list);
>> 
>> -             while (!list_empty(&list)) {
>> -                     enum work_attr attr;
>> -                     work = list_first_entry(&list, struct work, w_list);
>> -                     list_del(&work->w_list);
>> -
>> -                     /*
>> -                      * work->done might free the work so we must
>> -                      * save its attr for qork_post_done().
>> -                      */
>> -                     attr = work->attr;
>> -                     work->done(work, 0);
>> -                     work_post_done(&wi->q, attr);
>> -             }
>> +             list_del(&work->w_list);
>> +
>> +             attr = work->attr;
>> +             work->done(work, 0);
>> +             work_post_done(&wi->q, attr);
>> +     }
>> +
>> +rewrite:
>> +     ret = write(wi->command_fd[1], &nr_events, sizeof(nr_events));
>> +     if (ret < 0) {
>> +             eprintf("can't write done, %m\n");
>> +             if (errno == EAGAIN || errno == EINTR)
>> +                     goto rewrite;
>> +
>> +             return;
>>      }
>> }
>> 
>> @@ -240,58 +292,53 @@ retest:
>>              list_add_tail(&work->w_list, &wi->finished_list);
>>              pthread_mutex_unlock(&wi->finished_lock);
>> 
>> -             kill(getpid(), SIGUSR2);
>> +             pthread_cond_signal(&wi->finished_cond);
>>      }
>> 
>>      pthread_exit(NULL);
>> }
>> 
>> -static int init_signalfd(void)
>> -{
>> -     int ret;
>> -     sigset_t mask;
>> -     static int done = 0;
>> -
>> -     if (done++)
>> -             return 0;
>> -
>> -     sigemptyset(&mask);
>> -     sigaddset(&mask, SIGUSR2);
>> -     sigprocmask(SIG_BLOCK, &mask, NULL);
>> -
>> -     sig_fd = signalfd(-1, &mask, 0);
>> -     if (sig_fd < 0) {
>> -             eprintf("failed to create a signal fd, %m\n");
>> -             return 1;
>> -     }
>> -
>> -     ret = fcntl(sig_fd, F_GETFL);
>> -     ret |= fcntl(sig_fd, F_SETFL, ret | O_NONBLOCK);
>> -
>> -     ret = register_event(sig_fd, bs_thread_request_done, NULL);
>> -
>> -     return 0;
>> -}
>> -
>> int init_work_queue(int nr)
>> {
>>      int i, ret;
>>      struct worker_info *wi;
>> 
>> -     ret = init_signalfd();
>> -     if (ret)
>> -             return -1;
>> -
>>      wi = zalloc(sizeof(*wi) + nr * sizeof(pthread_t));
>>      if (!wi)
>>              return -1;
>> 
>> +     ret = pipe(wi->command_fd);
>> +     if (ret) {
>> +             eprintf("failed to create command pipe, %m\n");
>> +             goto destroy_cond_mutex;
>> +     }
>> +
>> +     ret = pipe(wi->done_fd);
>> +     if (ret) {
>> +             eprintf("failed to done command pipe, %m\n");
>> +             goto close_command_fd;
>> +     }
>> +
>> +     ret = register_event(wi->done_fd[0], bs_thread_request_done, wi);
>> +     if (ret) {
>> +             eprintf("failed to add epoll event\n");
>> +             goto close_done_fd;
>> +     }
>> +
>> +     ret = pthread_create(&wi->ack_thread, NULL, bs_thread_ack_fn, wi);
>> +     if (ret) {
>> +             eprintf("failed to create an ack thread, %s\n", strerror(ret));
>> +             goto event_del;
>> +     }
>> +
>>      wi->nr_threads = nr;
>> 
>>      INIT_LIST_HEAD(&wi->q.pending_list);
>>      INIT_LIST_HEAD(&wi->q.blocked_list);
>>      INIT_LIST_HEAD(&wi->finished_list);
>> +     INIT_LIST_HEAD(&wi->ack_list);
>> 
>> +     pthread_cond_init(&wi->finished_cond, NULL);
>>      pthread_cond_init(&wi->pending_cond, NULL);
>> 
>>      pthread_mutex_init(&wi->finished_lock, NULL);
>> @@ -315,6 +362,14 @@ int init_work_queue(int nr)
>>      list_add(&wi->worker_info_siblings, &worker_info_list);
>>      wqueue = &wi->q;
>> 
>> +rewrite:
>> +     ret = write(wi->command_fd[1], &ret, sizeof(ret));
>> +     if (ret < 0) {
>> +             eprintf("can't write done, %m\n");
>> +             if (errno == EAGAIN || errno == EINTR)
>> +                     goto rewrite;
>> +     }
>> +
>>      return 0;
>> destroy_threads:
>> 
>> @@ -324,8 +379,15 @@ destroy_threads:
>>              pthread_join(wi->worker_thread[i - 1], NULL);
>>              eprintf("stopped the worker thread %d\n", i - 1);
>>      }
>> -
>> -/* destroy_cond_mutex: */
>> +event_del:
>> +     unregister_event(wi->done_fd[0]);
>> +close_done_fd:
>> +     close(wi->done_fd[0]);
>> +     close(wi->done_fd[1]);
>> +close_command_fd:
>> +     close(wi->command_fd[0]);
>> +     close(wi->command_fd[1]);
>> +destroy_cond_mutex:
>>      pthread_cond_destroy(&wi->pending_cond);
>>      pthread_mutex_destroy(&wi->pending_lock);
>>      pthread_mutex_destroy(&wi->startup_lock);
>> @@ -340,6 +402,9 @@ static void exit_work_queue(struct work_queue *q)
>>      int i;
>>      struct worker_info *wi = container_of(q, struct worker_info, q);
>> 
>> +     pthread_cancel(wi->ack_thread);
>> +     pthread_join(wi->ack_thread, NULL);
>> +
>>      q->wq_state |= WQ_DEAD;
>>      pthread_cond_broadcast(&wi->pending_cond);
>> 
>> @@ -351,5 +416,12 @@ static void exit_work_queue(struct work_queue *q)
>>      pthread_mutex_destroy(&wi->pending_lock);
>>      pthread_mutex_destroy(&wi->startup_lock);
>>      pthread_mutex_destroy(&wi->finished_lock);
>> +
>> +     pthread_cond_destroy(&wi->finished_cond);
>> +
>> +     close(wi->done_fd[0]);
>> +     close(wi->done_fd[1]);
>> +     close(wi->command_fd[0]);
>> +     close(wi->command_fd[1]);
>> }
>> #endif
> 
> --
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog




More information about the sheepdog mailing list