X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fstream-fd.c;h=7bf5ebd4dc5f903001115218160b17acee0827aa;hb=08f94c0e1a47518e73f954af8f61eb0df31ac8bd;hp=ef4dc8d9112eae8d625016b0788f8cd9acc448f4;hpb=2a022368f4b37559de5d5621a88c648023493f75;p=sliver-openvswitch.git diff --git a/lib/stream-fd.c b/lib/stream-fd.c index ef4dc8d91..7bf5ebd4d 100644 --- a/lib/stream-fd.c +++ b/lib/stream-fd.c @@ -28,12 +28,13 @@ #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" -VLOG_DEFINE_THIS_MODULE(stream_fd) +VLOG_DEFINE_THIS_MODULE(stream_fd); /* Active file descriptor stream. */ @@ -44,7 +45,7 @@ struct stream_fd char *unlink_path; }; -static struct stream_class stream_fd_class; +static const struct stream_class stream_fd_class; static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(10, 25); @@ -96,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); @@ -133,7 +154,7 @@ fd_wait(struct stream *stream, enum stream_wait_type wait) } } -static struct stream_class stream_fd_class = { +static const struct stream_class stream_fd_class = { "fd", /* name */ NULL, /* open */ fd_close, /* close */