[Sheepdog] Building on CentOS 5.5 x86_64

Yuriy Kohut ykohut at onapp.com
Thu Oct 14 13:56:05 CEST 2010


Got sheepdog builded and installed.

Thanks to Kazutaka's patch.

---
Yura

On Oct 14, 2010, at 1:20 PM, Yuriy Kohut wrote:

> 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