X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=store.cc;h=8f2c8b328c2d7cacea3ca4c3683993532d1a7980;hb=def20364a3596d7b1fa4a07f3d3ee056cfff2d1e;hp=57ee11ba163ded18af96b2a9206dd2b63508f7eb;hpb=57890fff9773a368f241a25c89931a5d67fccb4e;p=cumulus.git diff --git a/store.cc b/store.cc index 57ee11b..8f2c8b3 100644 --- a/store.cc +++ b/store.cc @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -27,10 +28,13 @@ using std::max; using std::list; +using std::map; using std::set; using std::string; -static char *const filter_program[] = {"bzip2", "-c", NULL}; +/* Default filter program is bzip2 */ +const char *filter_program = "bzip2 -c"; +const char *filter_extension = ".bz2"; static void cloexec(int fd) { @@ -53,7 +57,7 @@ Tarfile::Tarfile(const string &path, const string &segment) filter_fd = spawn_filter(real_fd); if (tar_fdopen(&t, filter_fd, (char *)path.c_str(), NULL, - O_WRONLY | O_CREAT, 0600, TAR_VERBOSE | TAR_GNU) == -1) + O_WRONLY | O_CREAT, 0666, TAR_VERBOSE | TAR_GNU) == -1) throw IOException("Error opening Tarfile"); } @@ -112,7 +116,7 @@ int Tarfile::spawn_filter(int fd_out) close(fd_out); /* Exec the filter program. */ - execvp(filter_program[0], filter_program); + execlp("/bin/sh", "/bin/sh", "-c", filter_program, NULL); /* Should not reach here except for error cases. */ fprintf(stderr, "Could not exec filter: %m\n"); @@ -192,6 +196,8 @@ size_t Tarfile::size_estimate() static const size_t SEGMENT_SIZE = 4 * 1024 * 1024; +static map group_sizes; + ObjectReference TarSegmentStore::write_object(const char *data, size_t len, const std::string &group) { @@ -204,7 +210,8 @@ ObjectReference TarSegmentStore::write_object(const char *data, size_t len, segment->name = generate_uuid(); - string filename = path + "/" + segment->name + ".tar.bz2"; + string filename = path + "/" + segment->name + ".tar"; + filename += filter_extension; segment->file = new Tarfile(filename, segment->name); segment->count = 0; @@ -221,6 +228,8 @@ ObjectReference TarSegmentStore::write_object(const char *data, size_t len, segment->file->write_object(id, data, len); segment->count++; + group_sizes[group] += len; + ObjectReference ref(segment->name, id_buf); // If this segment meets or exceeds the size target, close it so that @@ -237,6 +246,15 @@ void TarSegmentStore::sync() close_segment(segments.begin()->first); } +void TarSegmentStore::dump_stats() +{ + printf("Data written:\n"); + for (map::iterator i = group_sizes.begin(); + i != group_sizes.end(); ++i) { + printf(" %s: %lld\n", i->first.c_str(), i->second); + } +} + void TarSegmentStore::close_segment(const string &group) { struct segment_info *segment = segments[group];