diff options
author | Alan D. Brunelle <alan.brunelle@hp.com> | 2009-01-23 09:48:21 -0500 |
---|---|---|
committer | Alan D. Brunelle <alan.brunelle@hp.com> | 2009-01-23 09:48:21 -0500 |
commit | 99bb5ebc255618e4af913d2e5f1bf268af552bdf (patch) | |
tree | 583ae4e2f228cdad0098560c21baf592d25dc259 | |
parent | 69dd57c2986bb025d7de12ab6eb52d5cd130d453 (diff) | |
download | blktrace-99bb5ebc255618e4af913d2e5f1bf268af552bdf.tar.gz |
Fix btt to handle large numbers of output files
Simply bump resource limits if file opens fail, and retry.
Signed-off-by: Alan D. Brunelle <alan.brunelle@hp.com>
-rw-r--r-- | btt/aqd.c | 2 | ||||
-rw-r--r-- | btt/args.c | 10 | ||||
-rw-r--r-- | btt/bno_dump.c | 2 | ||||
-rw-r--r-- | btt/devmap.c | 2 | ||||
-rw-r--r-- | btt/devs.c | 2 | ||||
-rw-r--r-- | btt/globals.h | 1 | ||||
-rw-r--r-- | btt/latency.c | 2 | ||||
-rw-r--r-- | btt/misc.c | 46 | ||||
-rw-r--r-- | btt/output.c | 4 | ||||
-rw-r--r-- | btt/plat.c | 2 | ||||
-rw-r--r-- | btt/seek.c | 4 |
11 files changed, 61 insertions, 16 deletions
@@ -43,7 +43,7 @@ void *aqd_init(char *str) oname = malloc(strlen(aqd_name) + strlen(str) + 32); sprintf(oname, "%s_%s.dat", aqd_name, str); - if ((ap->fp = fopen(oname, "w")) == NULL) { + if ((ap->fp = my_fopen(oname, "w")) == NULL) { perror(oname); return NULL; } @@ -240,7 +240,7 @@ static FILE *setup_ofile(char *fname) { if (fname) { char *buf; - FILE *ofp = fopen(fname, "w"); + FILE *ofp = my_fopen(fname, "w"); if (!ofp) { perror(fname); @@ -382,7 +382,7 @@ void handle_args(int argc, char *argv[]) char *fname = malloc(strlen(output_name) + 32); sprintf(fname, "%s.dat", output_name); - ranges_ofp = fopen(fname, "w"); + ranges_ofp = my_fopen(fname, "w"); if (ranges_ofp == NULL) { perror(fname); exit(1); @@ -391,7 +391,7 @@ void handle_args(int argc, char *argv[]) printf("Sending range data to %s\n", fname); sprintf(fname, "%s.avg", output_name); - avgs_ofp = fopen(fname, "w"); + avgs_ofp = my_fopen(fname, "w"); if (avgs_ofp == NULL) { perror(fname); exit(1); @@ -400,7 +400,7 @@ void handle_args(int argc, char *argv[]) printf("Sending stats data to %s\n", fname); sprintf(fname, "%s.msg", output_name); - msgs_ofp = fopen(fname, "w"); + msgs_ofp = my_fopen(fname, "w"); if (msgs_ofp == NULL) { perror(fname); exit(1); @@ -410,7 +410,7 @@ void handle_args(int argc, char *argv[]) if (easy_parse_avgs) { sprintf(fname, "%s.xvg", output_name); - xavgs_ofp = fopen(fname, "w"); + xavgs_ofp = my_fopen(fname, "w"); if (avgs_ofp == NULL) { perror(fname); exit(1); diff --git a/btt/bno_dump.c b/btt/bno_dump.c index 1f5433b..7f7680e 100644 --- a/btt/bno_dump.c +++ b/btt/bno_dump.c @@ -37,7 +37,7 @@ static FILE *bno_dump_open(__u32 device, char rwc) oname = malloc(strlen(bno_dump_name) + 32); sprintf(oname, "%s_%03d,%03d_%c.dat", bno_dump_name, mjr, mnr, rwc); - if ((fp = fopen(oname, "w")) == NULL) + if ((fp = my_fopen(oname, "w")) == NULL) perror(oname); else add_file(&bno_dump_files, fp, oname); diff --git a/btt/devmap.c b/btt/devmap.c index a74f224..5841446 100644 --- a/btt/devmap.c +++ b/btt/devmap.c @@ -59,7 +59,7 @@ int dev_map_read(char *fname) { char line[256]; struct devmap dm; - FILE *fp = fopen(fname, "r"); + FILE *fp = my_fopen(fname, "r"); if (!fp) { perror(fname); @@ -110,7 +110,7 @@ static inline char *mkhandle(char *str, __u32 device, char *post) static inline FILE *open_pit(char *str) { - FILE *fp = fopen(str, "w"); + FILE *fp = my_fopen(str, "w"); if (fp == NULL) perror(str); diff --git a/btt/globals.h b/btt/globals.h index 0ee06ed..cc83095 100644 --- a/btt/globals.h +++ b/btt/globals.h @@ -262,6 +262,7 @@ void clean_files(struct file_info **fipp); void add_buf(void *buf); void clean_bufs(void); char *make_dev_hdr(char *pad, size_t len, struct d_info *dip, int add_parens); +FILE *my_fopen(const char *path, const char *mode); void dbg_ping(void); /* mmap.c */ diff --git a/btt/latency.c b/btt/latency.c index 0c6e55d..d12f60c 100644 --- a/btt/latency.c +++ b/btt/latency.c @@ -41,7 +41,7 @@ FILE *latency_open(__u32 device, char *name, char *post) oname = malloc(strlen(name)+32); sprintf(oname, "%s_%03d,%03d_%s.dat", name, mjr, mnr, post); - if ((fp = fopen(oname, "w")) == NULL) + if ((fp = my_fopen(oname, "w")) == NULL) perror(oname); else add_file(&all_files, fp, oname); @@ -18,11 +18,14 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ +#include <errno.h> #include <stdio.h> #include <string.h> +#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> -#include <unistd.h> +#include <sys/time.h> +#include <sys/resource.h> #define INLINE_DECLARE #include "globals.h" @@ -116,4 +119,45 @@ char *make_dev_hdr(char *pad, size_t len, struct d_info *dip, int add_parens) return pad; } +/* + * Due to the N(devs) parts of a lot of the output features provided + * by btt, it will fail opens on large(ish) systems. Here we try to + * keep bumping our open file limits, and if those fail, we return NULL. + * + * Root users will probably be OK with this, others... + */ +FILE *my_fopen(const char *path, const char *mode) +{ + FILE *fp; + + fp = fopen(path, mode); + while (fp == NULL) { + if (errno == ENFILE || errno == EMFILE) { + struct rlimit rlim; + + if (getrlimit(RLIMIT_NOFILE, &rlim) < 0) { + perror("get: RLIMIT_NOFILE"); + return NULL; + } + + rlim.rlim_cur++; + if (rlim.rlim_cur >= rlim.rlim_max) + rlim.rlim_max++; + + if (setrlimit(RLIMIT_NOFILE, &rlim) < 0) { + perror("set: RLIMIT_NOFILE"); + return NULL; + } + } + else { + perror(path); + return NULL; + } + + fp = fopen(path, mode); + } + + return fp; +} + void dbg_ping(void) {} diff --git a/btt/output.c b/btt/output.c index c08e7da..ace1bcd 100644 --- a/btt/output.c +++ b/btt/output.c @@ -678,7 +678,7 @@ void output_histos(void) if (output_name == NULL) return; sprintf(fname, "%s_qhist.dat", output_name); - ofp = fopen(fname, "w"); + ofp = my_fopen(fname, "w"); if (!ofp) { perror(fname); return; @@ -693,7 +693,7 @@ void output_histos(void) fclose(ofp); sprintf(fname, "%s_dhist.dat", output_name); - ofp = fopen(fname, "w"); + ofp = my_fopen(fname, "w"); if (!ofp) { perror(fname); return; @@ -42,7 +42,7 @@ void *plat_init(char *str) oname = malloc(strlen(str) + 32); sprintf(oname, "%s.dat", str); - if ((pp->fp = fopen(oname, "w")) == NULL) { + if ((pp->fp = my_fopen(oname, "w")) == NULL) { perror(oname); return NULL; } @@ -53,7 +53,7 @@ static FILE *seek_open(char *str, char rw) oname = malloc(strlen(seek_name) + strlen(str) + 32); sprintf(oname, "%s_%s_%c.dat", seek_name, str, rw); - if ((fp = fopen(oname, "w")) == NULL) + if ((fp = my_fopen(oname, "w")) == NULL) perror(oname); else add_file(&seek_files, fp, oname); @@ -187,7 +187,7 @@ void *seeki_init(char *str) oname = malloc(strlen(sps_name) + strlen(str) + 32); sprintf(oname, "%s_%s.dat", sps_name, str); - if ((sip->sps_fp = fopen(oname, "w")) == NULL) + if ((sip->sps_fp = my_fopen(oname, "w")) == NULL) perror(oname); else add_file(&seek_files, sip->sps_fp, oname); |