X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fstream-fd.c;h=2026db6afc1c7d562dfa0796a1cdcf5d0e16ad28;hb=bbdc31bcff1efb9638e479b7e33b701e1159c7fe;hp=46aa8e7386cf5cdd934a237a01c859cc3572c578;hpb=c34b65c731a1b6dae014efe8895141e5b2fe758a;p=sliver-openvswitch.git diff --git a/lib/stream-fd.c b/lib/stream-fd.c index 46aa8e738..2026db6af 100644 --- a/lib/stream-fd.c +++ b/lib/stream-fd.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,18 +21,20 @@ #include #include #include +#include #include #include #include "fatal-signal.h" #include "leak-checker.h" #include "poll-loop.h" #include "socket-util.h" +#include "stress.h" #include "util.h" #include "stream-provider.h" #include "stream.h" - #include "vlog.h" -#define THIS_MODULE VLM_stream_fd + +VLOG_DEFINE_THIS_MODULE(stream_fd); /* Active file descriptor stream. */ @@ -95,19 +97,39 @@ fd_connect(struct stream *stream) return check_connection_completion(s->fd); } +STRESS_OPTION( + stream_flaky_recv, "simulate failure of fd stream recvs", + 100, 0, -1, 0); + static ssize_t fd_recv(struct stream *stream, void *buffer, size_t n) { struct stream_fd *s = stream_fd_cast(stream); - ssize_t retval = read(s->fd, buffer, n); + ssize_t retval; + + if (STRESS(stream_flaky_recv)) { + return -EIO; + } + + retval = read(s->fd, buffer, n); return retval >= 0 ? retval : -errno; } +STRESS_OPTION( + stream_flaky_send, "simulate failure of fd stream sends", + 100, 0, -1, 0); + static ssize_t fd_send(struct stream *stream, const void *buffer, size_t n) { struct stream_fd *s = stream_fd_cast(stream); - ssize_t retval = write(s->fd, buffer, n); + ssize_t retval; + + if (STRESS(stream_flaky_send)) { + return -EIO; + } + + retval = write(s->fd, buffer, n); return (retval > 0 ? retval : retval == 0 ? -EAGAIN : -errno); @@ -139,6 +161,8 @@ static struct stream_class stream_fd_class = { fd_connect, /* connect */ fd_recv, /* recv */ fd_send, /* send */ + NULL, /* run */ + NULL, /* run_wait */ fd_wait, /* wait */ }; @@ -211,7 +235,7 @@ pfd_accept(struct pstream *pstream, struct stream **new_streamp) new_fd = accept(ps->fd, (struct sockaddr *) &ss, &ss_len); if (new_fd < 0) { - int retval = errno; + retval = errno; if (retval != EAGAIN) { VLOG_DBG_RL(&rl, "accept: %s", strerror(retval)); }