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
cf3eea9
..
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,6
+28,7
@@
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;
@@
-55,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");
}
@@
-194,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)
{
@@
-224,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
@@
-240,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];