CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
pack.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_PACK_H_
6 #define CVMFS_PACK_H_
7 
8 #include <inttypes.h>
9 #include <pthread.h>
10 
11 #include <cstdio>
12 #include <set>
13 #include <string>
14 #include <vector>
15 
16 #include "crypto/hash.h"
17 #include "gtest/gtest_prod.h"
18 #include "util/concurrency.h"
19 #include "util/single_copy.h"
20 
36  FRIEND_TEST(T_Pack, Bucket);
37  FRIEND_TEST(T_Pack, ObjectPack);
38  FRIEND_TEST(T_Pack, ObjectPackTransfer);
39 
40  private:
41  struct Bucket;
42 
43  public:
44  typedef Bucket *BucketHandle;
45 
57  };
58 
59  static const uint64_t kDefaultLimit = 200 * 1024 * 1024; // 200MB
60 
66  static const uint64_t kMaxObjects = 100000;
67 
68  explicit ObjectPack(const uint64_t limit = kDefaultLimit);
69  ~ObjectPack();
70 
71  static void AddToBucket(const void *buf, const uint64_t size,
72  const BucketHandle handle);
73 
75 
76  bool CommitBucket(const BucketContentType type, const shash::Any &id,
77  const BucketHandle handle, const std::string &name = "");
78 
79  void DiscardBucket(const BucketHandle handle);
80  void TransferBucket(const BucketHandle handle, ObjectPack *other);
81 
82  unsigned char *BucketContent(size_t idx) const;
83  uint64_t BucketSize(size_t idx) const;
84  const shash::Any &BucketId(size_t idx) const;
85 
86  uint64_t size() const { return size_; }
87 
88  // This returns the number of objects in the pack (equal to the number of
89  // committed buckets)
90  size_t GetNoObjects() const { return buckets_.size(); }
91 
92  private:
97  struct Bucket : SingleCopy {
98  static const unsigned kInitialSize = 128;
99 
100  Bucket();
101  ~Bucket();
102  void Add(const void *buf, const uint64_t buf_size);
103 
104  unsigned char *content;
105  uint64_t size;
106  uint64_t capacity;
109  std::string name;
110  };
111 
112  void InitLock();
113 
117  pthread_mutex_t *lock_;
118 
122  uint64_t limit_;
126  uint64_t size_;
130  std::set<BucketHandle> open_buckets_;
134  std::vector<BucketHandle> buckets_;
135 };
136 
142 namespace ObjectPackBuild {
143 struct Event {
144  Event(const shash::Any &id, uint64_t size, unsigned buf_size, const void *buf,
145  ObjectPack::BucketContentType type, const std::string &name)
146  : id(id)
147  , size(size)
148  , buf_size(buf_size)
149  , buf(buf)
150  , object_type(type)
151  , object_name(name) { }
152 
154  uint64_t size;
155  unsigned buf_size;
156  const void *buf;
158  std::string object_name;
159 };
160 
161 enum State {
168 };
169 } // namespace ObjectPackBuild
170 
187  public:
188  explicit ObjectPackProducer(ObjectPack *pack);
189  ObjectPackProducer(const shash::Any &id, FILE *big_file,
190  const std::string &file_name = "");
191  unsigned ProduceNext(const unsigned buf_size, unsigned char *buf);
192  void GetDigest(shash::Any *hash);
193  unsigned GetHeaderSize() { return header_.size(); }
194 
195  private:
200 
204  FILE *big_file_;
205 
209  uint64_t pos_;
210 
214  size_t idx_;
215 
220 
224  std::string header_;
225 };
226 
234 class ObjectPackConsumer : public Observable<ObjectPackBuild::Event> {
235  public:
236  explicit ObjectPackConsumer(const shash::Any &expected_digest,
237  const unsigned expected_header_size);
238  ObjectPackBuild::State ConsumeNext(const unsigned buf_size,
239  const unsigned char *buf);
240 
241  private:
245  static const unsigned kAccuSize = 128 * 1024;
246 
247  struct IndexEntry {
249  IndexEntry(const shash::Any &id, const uint64_t size,
250  ObjectPack::BucketContentType type, const std::string &name)
251  : id(id), size(size), entry_type(type), entry_name(name) { }
253  uint64_t size;
255  std::string entry_name;
256  };
257 
258  bool ParseHeader();
259  bool ParseItem(const std::string &line, IndexEntry *entry,
260  uint64_t *sum_size);
261 
262  ObjectPackBuild::State ConsumePayload(const unsigned buf_size,
263  const unsigned char *buf);
264 
267 
271  uint64_t pos_;
272 
276  unsigned idx_;
277 
281  unsigned pos_in_object_;
282 
287  unsigned char accumulator_[kAccuSize];
288 
292  unsigned pos_in_accu_;
293 
299 
304  std::string raw_header_;
305 
309  uint64_t size_;
310 
314  std::vector<IndexEntry> index_;
315 };
316 
317 #endif // CVMFS_PACK_H_
Event(const shash::Any &id, uint64_t size, unsigned buf_size, const void *buf, ObjectPack::BucketContentType type, const std::string &name)
Definition: pack.h:144
unsigned char accumulator_[kAccuSize]
Definition: pack.h:287
BucketContentType
Definition: pack.h:53
ObjectPackConsumer(const shash::Any &expected_digest, const unsigned expected_header_size)
Definition: pack.cc:266
std::string header_
Definition: pack.h:224
unsigned idx_
Definition: pack.h:276
void TransferBucket(const BucketHandle handle, ObjectPack *other)
Definition: pack.cc:154
void Add(const void *buf, const uint64_t buf_size)
Definition: pack.cc:66
uint64_t size_
Definition: pack.h:126
static const uint64_t kMaxObjects
Definition: pack.h:66
std::string entry_name
Definition: pack.h:255
FILE * big_file_
Definition: pack.h:204
const shash::Any & BucketId(size_t idx) const
Definition: pack.cc:171
pthread_mutex_t * lock_
Definition: pack.h:117
ObjectPackProducer(ObjectPack *pack)
Definition: pack.cc:186
std::string object_name
Definition: pack.h:158
unsigned char * BucketContent(size_t idx) const
Definition: pack.cc:161
size_t idx_
Definition: pack.h:214
static const unsigned kInitialSize
Definition: pack.h:98
uint64_t size() const
Definition: pack.h:86
Bucket * BucketHandle
Definition: pack.h:41
unsigned pos_in_object_
Definition: pack.h:281
uint64_t size
Definition: pack.h:253
IndexEntry()
Definition: pack.h:248
BucketHandle NewBucket()
Definition: pack.cc:105
unsigned expected_header_size_
Definition: pack.h:266
unsigned char * content
Definition: pack.h:104
static const unsigned kAccuSize
Definition: pack.h:245
size_t pos_in_bucket_
Definition: pack.h:219
unsigned pos_in_accu_
Definition: pack.h:292
std::string name
Definition: pack.h:109
static const uint64_t kDefaultLimit
Definition: pack.h:59
ObjectPackBuild::State ConsumePayload(const unsigned buf_size, const unsigned char *buf)
Definition: pack.cc:350
uint64_t BucketSize(size_t idx) const
Definition: pack.cc:166
ObjectPackBuild::State ConsumeNext(const unsigned buf_size, const unsigned char *buf)
Definition: pack.cc:289
Definition: pack.h:247
uint64_t capacity
Definition: pack.h:106
void InitLock()
Definition: pack.cc:144
bool ParseHeader()
Definition: pack.cc:400
BucketContentType content_type
Definition: pack.h:108
std::vector< IndexEntry > index_
Definition: pack.h:314
shash::Any id
Definition: pack.h:153
std::vector< BucketHandle > buckets_
Definition: pack.h:134
void GetDigest(shash::Any *hash)
Definition: pack.cc:181
const void * buf
Definition: pack.h:156
void DiscardBucket(const BucketHandle handle)
Definition: pack.cc:138
bool ParseItem(const std::string &line, IndexEntry *entry, uint64_t *sum_size)
Definition: pack.cc:443
uint64_t size
Definition: pack.h:105
ObjectPack::BucketContentType object_type
Definition: pack.h:157
std::set< BucketHandle > open_buckets_
Definition: pack.h:130
ObjectPack::BucketContentType entry_type
Definition: pack.h:254
shash::Any id
Definition: pack.h:252
~ObjectPack()
Definition: pack.cc:86
ObjectPack(const uint64_t limit=kDefaultLimit)
Definition: pack.cc:82
uint64_t limit_
Definition: pack.h:122
shash::Any id
Definition: pack.h:107
uint64_t size_
Definition: pack.h:309
IndexEntry(const shash::Any &id, const uint64_t size, ObjectPack::BucketContentType type, const std::string &name)
Definition: pack.h:249
unsigned GetHeaderSize()
Definition: pack.h:193
bool CommitBucket(const BucketContentType type, const shash::Any &id, const BucketHandle handle, const std::string &name="")
Definition: pack.cc:116
ObjectPack * pack_
Definition: pack.h:199
static void AddToBucket(const void *buf, const uint64_t size, const BucketHandle handle)
Definition: pack.cc:100
uint64_t pos_
Definition: pack.h:209
size_t GetNoObjects() const
Definition: pack.h:90
std::string raw_header_
Definition: pack.h:304
ObjectPackBuild::State state_
Definition: pack.h:298
unsigned buf_size
Definition: pack.h:155
unsigned ProduceNext(const unsigned buf_size, unsigned char *buf)
Definition: pack.cc:221
shash::Any expected_digest_
Definition: pack.h:265
uint64_t pos_
Definition: pack.h:271
FRIEND_TEST(T_Pack, Bucket)