[Sheepdog] Building on CentOS 5.5 x86_64
Yuriy Kohut
ykohut at onapp.com
Thu Oct 14 11:44:33 CEST 2010
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
More information about the sheepdog
mailing list