线程池入口
如下图所示,从rgw_main.cc
进行异步操作的封装均对RGWAsyncRadosRequest进行相关操作进行重写
对RGWAsyncRadosProcess进行深入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//rgw_cr_rados.h
class RGWAsyncRadosProcessor{
deque<RGWAsyncRadosRequest* > m_req_queue;
std::atomic<bool> going_down = { false };
protected:
RGWRados *store;
ThreadPool m_tp;
Throttle req_throttle;
struct RGWWQ : public ThreadPool::WorkQueue<RGWAsyncRadosRequest>{
RGWAsyncRadosProcessor *processor;
RGWWQ(RGWAsyncRadosProcessor *p, time_t time_out, time_t suicide_timeout, ThreadPool *tp):
ThreadPool::WorkQueue<RGWAsyncRadosRequest>("RGWWQ", timeout, suicide_timeout, tp), processor(p){
}
bool _enqueue(RGWAsyncRadosRequest* req) override;
void _dequeue(RGWAsyncRadosRequest* req) override{
ceph_abort();
}
bool _empty() ovrride;
RGWAsyncRadosRequest *_dequeue() override;
using ThreadPool::WorkQueue<RGWAsyncRadosRequest>::_process;
void _process(RGWAsyncRadosRequest *req, ThreadPool::TPHandle& handle) override;
void _dump_queue();
void _clear() override{
ceph_assert(processor->m_req_queue.empty());
}req_wq;
}
public:
RGWAsyncRadosProcessor(RGWRados* _store, int num_threads);
~RGWAsyncRadosProcessor(){}
void start();
void stop();
void handle_request(RGWAsyncRadosRequest* req);
void queue(RGWAsyncRadosRequest* req);
bool is_going_down(){
return going_down;
}
}
- 使用工作队列进行封装 【struct RGWWQ : public ThreadPool::WorkQueue】
- 关注_process()即可
1 | RGWRemoteMetaLog |
RGW 数据存放规则
zone级别的placement
placement rule即数据的存放规则,可在placement rule中定义存储桶索引数据存放的存储
池index pool, 对象数据存放的存储池data pool中,以及通过Multipart 上传大文件临时数据
存放的存储池data extra pool
placement rule是针对所使用的存储池进行定义,而存储池是位于zone 之下的概念,所以在
RGW中将 placement rule 作为一个 zone 级别的配置,其作用影响的力度为存储桶级,即可指定
存储桶所使用的placement rule, 那所有上传到该存储桶中的对象数据都会按照该存储桶的place
rule 定义的存储规则进行存放。用户为不同的存储桶配置不同的placement rule来实现将不同存
储桶中的对象数据存放在不同的存储节点或使用不同的存储策略;
1 | //查看当前placement rule |
zonegroup 级placement
1 | //查看当前zonegroup 的placement |