21 Md5::Md5(
const char *chars,
const unsigned length) {
56 namespace inode_tracker {
58 bool InodeContainer::ConstructPath(
const uint64_t inode,
PathString *path) {
59 InodeMap::const_iterator needle = map_.find(inode);
60 if (needle == map_.end())
63 if (needle->second.name.IsEmpty())
66 bool retval = ConstructPath(needle->second.parent_inode, path);
68 path->
Append(needle->second.name.GetChars(),
69 needle->second.name.GetLength());
75 InodeTracker::~InodeTracker() {
76 pthread_mutex_destroy(lock_);
81 InodeContainer::InodeMap::const_iterator i, iEnd;
84 for (; i != iEnd; ++i) {
85 uint64_t inode = i->first;
86 uint32_t references = i->second.references;
100 namespace inode_tracker_v2 {
103 return (uint32_t) *((uint32_t *)key.
digest + 1);
107 return MurmurHash2(&inode,
sizeof(inode), 0x07387a4f);
116 for (
unsigned i = 0; i < old_inodes->
capacity_; ++i) {
117 const uint64_t inode = old_inodes->
keys_[i];
118 if (inode == 0)
continue;
120 const uint32_t references = old_inodes->
values_[i];
122 bool retval = old_tracker->
FindPath(inode, &path);
135 namespace inode_tracker_v3 {
138 return (uint32_t) *((uint32_t *)key.
digest + 1);
142 return MurmurHash2(&inode,
sizeof(inode), 0x07387a4f);
152 for (
unsigned i = 0; i < old_inodes->
capacity(); ++i) {
153 const uint64_t inode = old_inodes->
keys()[i];
154 if (inode == 0)
continue;
156 const uint32_t references = old_inodes->
values()[i];
158 bool retval = old_tracker->
FindPath(inode, &path);
171 namespace chunk_tables {
174 pthread_mutex_destroy(lock);
176 for (
unsigned i = 0; i < kNumHandleLocks; ++i) {
177 pthread_mutex_destroy(handle_locks.At(i));
178 free(handle_locks.At(i));
189 for (
unsigned keyno = 0; keyno < old_inode2chunks->
capacity(); ++keyno) {
190 const uint64_t inode = old_inode2chunks->
keys()[keyno];
191 if (inode == 0)
continue;
196 for (
unsigned i = 0; i < old_list->
size(); ++i) {
198 off_t offset = old_chunk->
offset();
217 namespace chunk_tables_v2 {
220 pthread_mutex_destroy(lock);
222 for (
unsigned i = 0; i < kNumHandleLocks; ++i) {
223 pthread_mutex_destroy(handle_locks.At(i));
224 free(handle_locks.At(i));
235 for (
unsigned keyno = 0; keyno < old_inode2chunks->
capacity(); ++keyno) {
236 const uint64_t inode = old_inode2chunks->
keys()[keyno];
237 if (inode == 0)
continue;
242 for (
unsigned i = 0; i < old_list->
size(); ++i) {
244 off_t offset = old_chunk->
offset();
263 namespace chunk_tables_v3 {
266 pthread_mutex_destroy(lock);
268 for (
unsigned i = 0; i < kNumHandleLocks; ++i) {
269 pthread_mutex_destroy(handle_locks.At(i));
270 free(handle_locks.At(i));
SmallHashDynamic< shash_v1::Md5, PathInfo > map_
SmallHashDynamic< uint64_t, shash_v1::Md5 > map_
SmallHashDynamic< uint64_t, FileChunkReflist > inode2chunks
static uint32_t hasher_md5(const shash_v1::Md5 &key)
SmallHashDynamic< uint64_t, FileChunkReflist > inode2chunks
SmallHashDynamic< uint64_t,::ChunkFd > handle2fd
SmallHashDynamic< shash_v1::Md5, PathInfo > map_
BigVector< FileChunk > * list
uint32_t(* hasher_)(const Key &key)
assert((mem||(size==0))&&"Out Of Memory")
SmallHashDynamic< uint64_t,::ChunkFd > handle2fd
unsigned char digest[digest_size_]
bool ConstructPath(const uint64_t inode, PathString *path)
unsigned char digest[digest_size_]
SmallHashDynamic< shash_v1::Md5, uint64_t > map_
SmallHashDynamic< uint64_t, uint32_t > map_
BigVector< FileChunk > * list
InodeReferences inode_references_
BigVector< FileChunk > FileChunkList
const unsigned kDigestSizes[]
bool FindPath(const uint64_t inode, PathString *path)
uint32_t capacity() const
shash_v2::Any content_hash_
content hash of the compressed file chunk
SmallHashDynamic< uint64_t, uint32_t > inode2references
SmallHashDynamic< uint64_t, shash_v1::Md5 > map_
SmallHashDynamic< uint64_t, uint32_t > inode2references
void Insert(const Key &key, const Value &value)
void Append(const char *chars, const unsigned length)
void VfsGetBy(const InodeEx inode_ex, const uint32_t by, const PathString &path)
SmallHashDynamic< uint64_t, uint32_t > map_
InodeReferences inode_references_
shash_v1::Any content_hash_
content hash of the compressed file chunk
void PushBack(const Item &item)
SmallHashDynamic< uint64_t, uint32_t > inode2references
void Migrate(InodeTracker *old_tracker, glue::InodeTracker *new_tracker)
void SetHasher(uint32_t(*hasher)(const Key &key))
bool FindPath(const uint64_t inode, PathString *path)
SmallHashDynamic< uint64_t,::ChunkFd > handle2fd
void MigrateAny(const Any *old_hash, shash::Any *new_hash)
InodeContainer inode2path_
SmallHashDynamic< uint64_t, FileChunkReflist > inode2chunks
const Item * AtPtr(const size_t index) const
unsigned char digest[digest_size_]
uint32_t MurmurHash2(const void *key, int len, uint32_t seed)
static uint32_t hasher_inode(const uint64_t &inode)