-
Notifications
You must be signed in to change notification settings - Fork 557
/
block_mapping.h
executable file
·78 lines (68 loc) · 2.59 KB
/
block_mapping.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Copyright (c) 2014, Baidu.com, Inc. All Rights Reserved
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <set>
#include <map>
#include <queue>
#include <gflags/gflags.h>
#include <common/mutex.h>
#include <common/thread_pool.h>
#include "proto/nameserver.pb.h"
namespace baidu {
namespace bfs {
struct NSBlock {
int64_t id;
int64_t version;
std::set<int32_t> replica;
int64_t block_size;
int32_t expect_replica_num;
bool pending_recover;
bool incomplete;
NSBlock();
NSBlock(int64_t block_id, int32_t replica, int64_t version, int64_t size);
bool operator<(const NSBlock &b) const {
return (this->replica.size() >= b.replica.size());
}
};
class BlockMapping {
public:
BlockMapping();
int64_t NewBlockID();
bool GetBlock(int64_t block_id, NSBlock* block);
bool GetReplicaLocation(int64_t id, std::set<int32_t>* chunkserver_id);
bool ChangeReplicaNum(int64_t block_id, int32_t replica_num);
void AddNewBlock(int64_t block_id, int32_t replica,
int64_t version, int64_t block_size,
const std::vector<int32_t>* init_replicas);
bool UpdateBlockInfo(int64_t id, int32_t server_id, int64_t block_size,
int64_t block_version, bool need_recovery);
void RemoveBlocksForFile(const FileInfo& file_info);
void RemoveBlock(int64_t block_id);
void DealWithDeadBlocks(int64_t cs_id, const std::set<int64_t>& blocks);
bool SetBlockVersion(int64_t block_id, int64_t version);
void PickRecoverBlocks(int32_t cs_id, int32_t block_num,
std::map<int64_t, int32_t>* recover_blocks);
void ProcessRecoveredBlock(int32_t cs_id, int64_t block_id, bool recover_success);
void GetStat(int64_t* recover_num, int64_t* pending_num,
int64_t* urgent_num, int64_t* lost_num,
int64_t* incomplete_num);
private:
void AddToRecover(NSBlock* block);
void TryRecover(NSBlock* block);
void CheckRecover(int64_t cs_id, int64_t block_id);
bool GetBlockPtr(int64_t block_id, NSBlock** block);
private:
Mutex mu_;
ThreadPool thread_pool_;
typedef std::map<int64_t, NSBlock*> NSBlockMap;
NSBlockMap block_map_;
int64_t next_block_id_;
std::priority_queue<std::pair<int64_t, int64_t> > recover_q_;
typedef std::map<int32_t, std::set<int64_t> > CheckList;
CheckList recover_check_;
std::set<int64_t> hi_pri_recover_;
std::set<int64_t> lost_blocks_;
std::set<int64_t> incomplete_blocks_;
};
} // namespace bfs
} // namespace baidu