commit 33aa3497b959ad985e7fb0f016da798f30f2eef0 from: Sergey Bronnikov date: Mon Jan 24 17:43:38 2022 UTC Add fault injection with 1-byte reads Closes #86 commit - ab9934da3316cf362e131acdcb2b3171ac7fbf5e commit + 33aa3497b959ad985e7fb0f016da798f30f2eef0 blob - 2aa1ff329a9854a3546308a2478d50ba2765ef88 blob + 50db83dc79e5f1e7414070beb4d8af7607a5aeeb --- README.md +++ README.md @@ -13,6 +13,8 @@ Supported fault injections are: (similar to [libeatmydata](https://github.com/stewartsmith/libeatmydata), but applicable to any file operation). - `errinj_slowdown` - slowdown invoked file operation. +- `errinj_1byte_read` - amount of data returned by `read()` call is always + limited by a single byte. ### Building blob - 30eeca1c904bafffd986784e482ba7cc4e28e3e3 blob + 217c01a4511b1b701ccc4797cc33df4cd314bbe8 --- unreliablefs-scm-1.rockspec +++ unreliablefs-scm-1.rockspec @@ -13,6 +13,8 @@ description = { - `errinj_kill_caller` - send SIGKILL to a process that invoked file operation; - `errinj_noop` - replace file operation with no operation; - `errinj_slowdown` - slowdown invoked file operation; + - `errinj_1byte_read` - amount of data returned by `read()` call is always + limited by a single byte. ]], homepage = "https://github.com/ligurio/unreliablefs", maintainer = "Sergey Bronnikov ", blob - 624bc25cbc29c1d549c4793cb4762e4fffb54cb9 blob + 80dcc3cbdabbe540e7a9508a1c46da01b70bc22f --- unreliablefs.conf.5 +++ unreliablefs.conf.5 @@ -36,6 +36,10 @@ Set random errno. limited by supported errno's. .It Cm errinj_slowdown File operation slowdown for nanoseconds specified by duration parameter. +.It Cm errinj_1byte_read +Return exactly 1 byte on every +.Xr read 2 +operation. .El .Pp The options are: @@ -69,6 +73,10 @@ probability = 70 path_regexp = *.xlog probability = 4 +[errinj_1byte_read] +path_regexp = *.xlog +probability = 100 + .Ed .Sh SEE ALSO .Xr unreliablefs 1 , blob - a069f4d30b8733e56219169b4b1fdef1463ff865 blob + 681de370bee5409a2d894725dac3f3e8b7c19dc2 --- unreliablefs_errinj.c +++ unreliablefs_errinj.c @@ -21,6 +21,7 @@ const char *errinj_name[] = "errinj_kill_caller", "errinj_noop", "errinj_slowdown", + "errinj_1byte_read", }; typedef enum { @@ -28,6 +29,7 @@ typedef enum { ERRINJ_KILL_CALLER, ERRINJ_NOOP, ERRINJ_SLOWDOWN, + ERRINJ_1BYTE_READ, } errinj_type; typedef struct errinj_conf errinj_conf; @@ -262,6 +264,11 @@ int error_inject(const char* path, fuse_op operation) fprintf(stdout, "end of '%s' slowdown with '%d' ns\n", op_name, err->duration); } break; + case ERRINJ_1BYTE_READ: + fprintf(stdout, "start of 1-byte read\n"); + if (strcmp(op_name, "read") == 0) + rc = -ERRINJ_1BYTE_READ; + break; } } blob - 299d5027cf13cf486938e683038b60e40fb351c7 blob + 4889de8d7338eb0cba5c6cfb742dce4469fb4e09 --- unreliablefs_errinj.h +++ unreliablefs_errinj.h @@ -22,6 +22,7 @@ #define MIN_PROBABLITY 0 #define MAX_PROBABLITY 100 #define ERRNO_NOOP -999 +#define ERRNO_1BYTE_READ -998 #define DEFAULT_SIGNAL_NAME SIGKILL int error_inject(const char* path, fuse_op operation); blob - f9d48d5620657020de0adbd34b01a2a66fc90241 blob + 2c20d7d3e8f7c14556e8854760919a4e48ef5551 --- unreliablefs_ops.c +++ unreliablefs_ops.c @@ -317,6 +317,8 @@ int unreliable_read(const char *path, char *buf, size_ int ret = error_inject(path, OP_READ); if (ret == -ERRNO_NOOP) { return 0; + } else if (ret == -ERRNO_1BYTE_READ) { + size = 1; } else if (ret) { return ret; }