[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