CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
item.cc
Go to the documentation of this file.
1 
5 #include "item.h"
6 
7 #include <algorithm>
8 #include <cassert>
9 #include <cstdlib>
10 #include <cstring>
11 
13 #include "item_mem.h"
14 #include "util/concurrency.h"
15 #include "util/smalloc.h"
16 
18  uint64_t min_chunk_size,
19  uint64_t avg_chunk_size,
20  uint64_t max_chunk_size,
21  zlib::Algorithms compression_algorithm,
22  shash::Algorithms hash_algorithm,
23  shash::Suffix hash_suffix,
24  bool may_have_chunks,
25  bool has_legacy_bulk_chunk)
26  : source_(source)
27  , compression_algorithm_(compression_algorithm)
28  , hash_algorithm_(hash_algorithm)
29  , hash_suffix_(hash_suffix)
30  , has_legacy_bulk_chunk_(has_legacy_bulk_chunk)
31  , size_(kSizeUnknown)
32  , may_have_chunks_(may_have_chunks)
33  , chunk_detector_(min_chunk_size, avg_chunk_size, max_chunk_size)
34  , bulk_hash_(hash_algorithm)
35  , chunks_(1) {
36  int retval = pthread_mutex_init(&lock_, NULL);
37  assert(retval == 0);
38  atomic_init64(&nchunks_in_fly_);
39  atomic_init32(&is_fully_chunked_);
40 }
41 
42 FileItem::~FileItem() { pthread_mutex_destroy(&lock_); }
43 
44 void FileItem::RegisterChunk(const FileChunk &file_chunk) {
45  MutexLockGuard lock_guard(lock_);
46 
47  switch (file_chunk.content_hash().suffix) {
49  chunks_.PushBack(file_chunk);
50  break;
51 
52  default:
53  assert(file_chunk.offset() == 0);
54  assert(file_chunk.size() == size_);
55  bulk_hash_ = file_chunk.content_hash();
56  break;
57  }
58  atomic_dec64(&nchunks_in_fly_);
59 }
60 
61 
62 //------------------------------------------------------------------------------
63 
64 
65 ChunkItem::ChunkItem(FileItem *file_item, uint64_t offset)
66  : file_item_(file_item)
67  , offset_(offset)
68  , size_(0)
69  , is_bulk_chunk_(false)
70  , upload_handle_(NULL)
71  , compressor_(NULL) {
72  hash_ctx_.algorithm = file_item->hash_algorithm();
79 }
80 
81 
83  is_bulk_chunk_ = true;
85 }
86 
87 
89  if (!compressor_.IsValid()) {
92  }
93  return compressor_.weak_ref();
94 }
95 
96 
98 
99 
100 //------------------------------------------------------------------------------
101 
103 
104 
106  : allocator_(allocator)
107  , type_(kBlockHollow)
108  , tag_(-1)
109  , file_item_(NULL)
110  , chunk_item_(NULL)
111  , data_(NULL)
112  , capacity_(0)
113  , size_(0) { }
114 
115 
116 BlockItem::BlockItem(int64_t tag, ItemAllocator *allocator)
117  : allocator_(allocator)
118  , type_(kBlockHollow)
119  , tag_(tag)
120  , file_item_(NULL)
121  , chunk_item_(NULL)
122  , data_(NULL)
123  , capacity_(0)
124  , size_(0) {
125  assert(tag_ >= 0);
126 }
127 
128 
130  if (data_)
132  atomic_xadd64(&managed_bytes_, -static_cast<int64_t>(capacity_));
133 }
134 
135 
137  data_ = NULL;
138  size_ = capacity_ = 0;
139 }
140 
141 
144  type_ = kBlockStop;
145 }
146 
147 
148 void BlockItem::MakeData(uint32_t capacity) {
150  assert(allocator_ != NULL);
151  assert(capacity > 0);
152 
153  type_ = kBlockData;
155  data_ = reinterpret_cast<unsigned char *>(allocator_->Malloc(capacity_));
156  atomic_xadd64(&managed_bytes_, static_cast<int64_t>(capacity_));
157 }
158 
159 
165  assert(other->type_ == kBlockData);
166  assert(other->size_ > 0);
167 
168  type_ = kBlockData;
169  capacity_ = size_ = other->size_;
170  data_ = other->data_;
171  allocator_ = other->allocator_;
172 
173  other->Discharge();
174 }
175 
176 
180 void BlockItem::MakeDataCopy(const unsigned char *data, uint32_t size) {
182  assert(allocator_ != NULL);
183  assert(size > 0);
184 
185  type_ = kBlockData;
186  capacity_ = size_ = size;
187  data_ = reinterpret_cast<unsigned char *>(allocator_->Malloc(capacity_));
188  memcpy(data_, data, size);
189  atomic_xadd64(&managed_bytes_, static_cast<int64_t>(capacity_));
190 }
191 
192 
194  assert(type_ == kBlockData);
195 
196  atomic_xadd64(&managed_bytes_, -static_cast<int64_t>(capacity_));
198  data_ = NULL;
199  size_ = capacity_ = 0;
201 }
202 
203 
205  assert(value != NULL);
206  assert(chunk_item_ == NULL);
207  chunk_item_ = value;
208 }
209 
210 
212  assert(value != NULL);
213  assert(file_item_ == NULL);
214  file_item_ = value;
215 }
216 
217 
218 uint32_t BlockItem::Write(void *buf, uint32_t count) {
219  assert(type_ == kBlockData);
220 
221  uint32_t remaining = capacity_ - size_;
222  uint32_t nbytes = std::min(remaining, count);
223  memcpy(data_ + size_, buf, nbytes);
224  size_ += nbytes;
225  return nbytes;
226 }
unsigned char * data_
Definition: item.h:254
void RegisterChunk(const FileChunk &file_chunk)
Definition: item.cc:44
void MakeDataMove(BlockItem *other)
Definition: item.cc:163
int64_t atomic_int64
Definition: atomic.h:18
uint32_t size_
Definition: item.h:256
void Discharge()
Definition: item.cc:136
shash::ContextPtr hash_ctx_
Definition: item.h:170
T * weak_ref() const
Definition: pointer.h:46
void SetChunkItem(ChunkItem *item)
Definition: item.cc:204
FileItem(IngestionSource *source, uint64_t min_chunk_size=4 *1024 *1024, uint64_t avg_chunk_size=8 *1024 *1024, uint64_t max_chunk_size=16 *1024 *1024, zlib::Algorithms compression_algorithm=zlib::kZlibDefault, shash::Algorithms hash_algorithm=shash::kSha1, shash::Suffix hash_suffix=shash::kSuffixNone, bool may_have_chunks=true, bool has_legacy_bulk_chunk=false)
Definition: item.cc:17
CVMFS_EXPORT const LogSource source
Definition: exception.h:33
shash::Algorithms hash_algorithm()
Definition: item.h:61
void * Malloc(unsigned size)
Definition: item_mem.cc:55
unsigned char hash_ctx_buffer_[shash::kMaxContextSize]
Definition: item.h:172
zlib::Compressor * GetCompressor()
Definition: item.cc:88
void Reset()
Definition: item.cc:193
ChunkItem * chunk_item_
Definition: item.h:249
pthread_mutex_t lock_
Definition: item.h:114
shash::Any hash_value_
Definition: item.h:171
const shash::Any & content_hash() const
Definition: file_chunk.h:37
BlockItem(ItemAllocator *allocator)
Definition: item.cc:105
assert((mem||(size==0))&&"Out Of Memory")
void SetFileItem(FileItem *item)
Definition: item.cc:211
uint32_t capacity()
Definition: item.h:212
bool is_bulk_chunk_
Definition: item.h:164
Algorithms algorithm
Definition: hash.h:122
void MakeBulkChunk()
Definition: item.cc:82
void ReleaseCompressor()
Definition: item.cc:97
ChunkItem(FileItem *file_item, uint64_t offset)
Definition: item.cc:65
void Init(ContextPtr context)
Definition: hash.cc:166
Algorithms
Definition: hash.h:41
static Compressor * Construct(const Algorithms &param)
Definition: plugin.h:170
FileChunkList chunks_
Definition: item.h:104
Algorithms
Definition: compression.h:44
const char kSuffixPartial
Definition: hash.h:57
Algorithms algorithm
Definition: hash.h:488
int64_t tag_
Definition: item.h:243
off_t offset() const
Definition: file_chunk.h:38
uint32_t capacity_
Definition: item.h:255
uint32_t size()
Definition: item.h:213
void MakeData(uint32_t capacity)
Definition: item.cc:148
~BlockItem()
Definition: item.cc:129
Definition: item.h:34
bool IsValid() const
Definition: pointer.h:47
atomic_int64 nchunks_in_fly_
Definition: item.h:108
void * buffer
Definition: hash.h:489
BlockType type_
Definition: item.h:235
void IncNchunksInFly()
Definition: item.h:83
shash::Suffix hash_suffix()
Definition: item.h:62
char Suffix
Definition: hash.h:111
unsigned GetContextSize(const Algorithms algorithm)
Definition: hash.cc:150
void PushBack(const Item &item)
Definition: bigvector.h:58
static atomic_int64 managed_bytes_
Definition: item.h:229
size_t size() const
Definition: file_chunk.h:39
FileItem * file_item_
Definition: item.h:248
Definition: mutex.h:42
uint64_t size_
Definition: item.h:99
zlib::Algorithms compression_algorithm()
Definition: item.h:60
ItemAllocator * allocator_
Definition: item.h:234
atomic_int32 is_fully_chunked_
Definition: item.h:113
~FileItem()
Definition: item.cc:42
void MakeDataCopy(const unsigned char *data, uint32_t size)
Definition: item.cc:180
Suffix suffix
Definition: hash.h:123
unsigned size
Definition: hash.h:490
uint32_t Write(void *buf, uint32_t count)
Definition: item.cc:218
shash::Any bulk_hash_
Definition: item.h:103
void MakeStop()
Definition: item.cc:142
static void size_t size
Definition: smalloc.h:54
UniquePtr< zlib::Compressor > compressor_
Definition: item.h:169
void Destroy()
Definition: pointer.h:53
FileItem * file_item_
Definition: item.h:157
void Free(void *ptr)
Definition: item_mem.cc:16