Commit 3a126180 authored by Chuck Lever's avatar Chuck Lever
Browse files

SUNRPC: Server-side disconnect injection



Disconnect injection stress-tests the ability for both client and
server implementations to behave resiliently in the face of network
instability.

A file called /sys/kernel/debug/fail_sunrpc/ignore-server-disconnect
enables administrators to turn off server-side disconnect injection
while allowing other types of sunrpc errors to be injected. The
default setting is that server-side disconnect injection is enabled
(ignore=false).

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent a4ae3081
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -259,6 +259,9 @@ static void fail_sunrpc_init(void)

	debugfs_create_bool("ignore-client-disconnect", S_IFREG | 0600, dir,
			    &fail_sunrpc.ignore_client_disconnect);

	debugfs_create_bool("ignore-server-disconnect", S_IFREG | 0600, dir,
			    &fail_sunrpc.ignore_server_disconnect);
}
#else
static void fail_sunrpc_init(void)
+2 −0
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@ struct fail_sunrpc_attr {
	struct fault_attr	attr;

	bool			ignore_client_disconnect;

	bool			ignore_server_disconnect;
};

extern struct fail_sunrpc_attr fail_sunrpc;
+8 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@

#include <trace/events/sunrpc.h>

#include "fail.h"

#define RPCDBG_FACILITY	RPCDBG_SVCDSP

static void svc_unregister(const struct svc_serv *serv, struct net *net);
@@ -1524,6 +1526,12 @@ svc_process(struct svc_rqst *rqstp)
	struct svc_serv		*serv = rqstp->rq_server;
	u32			dir;

#if IS_ENABLED(CONFIG_FAIL_SUNRPC)
	if (!fail_sunrpc.ignore_server_disconnect &&
	    should_fail(&fail_sunrpc.attr, 1))
		svc_xprt_deferred_close(rqstp->rq_xprt);
#endif

	/*
	 * Setup response xdr_buf.
	 * Initially it has just one page