projects
/
cumulus.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add support for octal and hexadecimal output in dumps.
[cumulus.git]
/
store.cc
diff --git
a/store.cc
b/store.cc
index
57ee11b
..
8f2c8b3
100644
(file)
--- a/
store.cc
+++ b/
store.cc
@@
-18,6
+18,7
@@
#include <algorithm>
#include <list>
#include <algorithm>
#include <list>
+#include <map>
#include <set>
#include <string>
#include <iostream>
#include <set>
#include <string>
#include <iostream>
@@
-27,10
+28,13
@@
using std::max;
using std::list;
using std::max;
using std::list;
+using std::map;
using std::set;
using std::string;
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)
{
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,
filter_fd = spawn_filter(real_fd);
if (tar_fdopen(&t, filter_fd, (char *)path.c_str(), NULL,
- O_WRONLY | O_CREAT, 06
00
, TAR_VERBOSE | TAR_GNU) == -1)
+ O_WRONLY | O_CREAT, 06
66
, TAR_VERBOSE | TAR_GNU) == -1)
throw IOException("Error opening Tarfile");
}
throw IOException("Error opening Tarfile");
}
@@
-112,7
+116,7
@@
int Tarfile::spawn_filter(int fd_out)
close(fd_out);
/* Exec the filter program. */
close(fd_out);
/* Exec the filter program. */
- exec
vp(filter_program[0], filter_program
);
+ exec
lp("/bin/sh", "/bin/sh", "-c", filter_program, NULL
);
/* Should not reach here except for error cases. */
fprintf(stderr, "Could not exec filter: %m\n");
/* 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 const size_t SEGMENT_SIZE = 4 * 1024 * 1024;
+static map<string, int64_t> group_sizes;
+
ObjectReference TarSegmentStore::write_object(const char *data, size_t len,
const std::string &group)
{
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();
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;
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++;
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
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);
}
close_segment(segments.begin()->first);
}
+void TarSegmentStore::dump_stats()
+{
+ printf("Data written:\n");
+ for (map<string, int64_t>::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];
void TarSegmentStore::close_segment(const string &group)
{
struct segment_info *segment = segments[group];