Aerospike迁移--2
来源:互联网 发布:sql基础教程第二版 pdf 编辑:程序博客网 时间:2024/06/08 09:21
emigration_send_start{ ...msg_set_uint32(m, MIG_FIELD_OP, OPERATION_START); ... uint64_t start_xmit_ms = 0; //向目标节点发送消息后,等待emig->ctrl_q队列接收到返回的ACK //如果在1秒钟内,没收到,则继续向目标节点重发;否则循环等待队列//emig->ctrl_q接收到不同的ACK类型,返回不同结果,外层调用做相应处理 while (true) { uint64_t now = cf_getms(); if (cf_queue_sz(emig->ctrl_q) == 0 && start_xmit_ms + MIGRATE_RETRANSMIT_STARTDONE_MS < now) { msg_incr_ref(m); as_fabric_send(emig->dest, m, AS_FABRIC_CHANNEL_CTRL);start_xmit_ms = now;} if (cf_queue_pop(emig->ctrl_q, &op, MIGRATE_RETRANSMIT_STARTDONE_MS) ==CF_QUEUE_OK) { switch (op) { case OPERATION_START_ACK_OK: as_fabric_msg_put(m); return EMIG_START_RESULT_OK; case OPERATION_START_ACK_EAGAIN: as_fabric_msg_put(m); return EMIG_START_RESULT_EAGAIN; case OPERATION_START_ACK_FAIL: cf_atomic_int_incr(&ns->migrate_tx_partitions_imbalance); as_fabric_msg_put(m); return EMIG_START_RESULT_ERROR; default: cf_warning(AS_MIGRATE, "unexpected ctrl op %d", op); break; } } } ...}
thread:run_fabric_recv->
fabric_connection_process_readable->
fabric_connection_process_msg:
(*g_fabric.msg_cb[m->type])(node, m, g_fabric.msg_udata[m->type]);
m->type;M_TYPE_MIGRATE即该函数是migrate_receive_msg_cb
emig->ctrl_q队列接收ACK是由run_fabric_recv线程处理,即由函数
migrate_receive_msg_cb处理。和迁入消息处理是一个函数。
intmigrate_receive_msg_cb(cf_node src, msg *m, void *udata){uint32_t op;if (msg_get_uint32(m, MIG_FIELD_OP, &op) != 0) {...}switch (op) {//--------------------------------------------// Emigration - handle requests://case OPERATION_MERGE_META:emigration_handle_meta_batch_request(src, m);break;//--------------------------------------------// 迁入Immigration - handle requests://case OPERATION_START:immigration_handle_start_request(src, m);break;case OPERATION_INSERT:immigration_handle_insert_request(src, m);break;case OPERATION_DONE:immigration_handle_done_request(src, m);break;case OPERATION_ALL_DONE:immigration_handle_all_done_request(src, m);break;//--------------------------------------------// 迁出Emigration - handle acknowledgments://case OPERATION_INSERT_ACK:emigration_handle_insert_ack(src, m);break;case OPERATION_START_ACK_OK:case OPERATION_START_ACK_EAGAIN:case OPERATION_START_ACK_FAIL:case OPERATION_DONE_ACK:case OPERATION_ALL_DONE_ACK:emigration_handle_ctrl_ack(src, m, op);break;//--------------------------------------------// Immigration - handle acknowledgments://case OPERATION_MERGE_META_ACK:immigration_handle_meta_batch_ack(src, m);break;default:cf_detail(AS_MIGRATE, "received unexpected message op %u", op);as_fabric_msg_put(m);break;}return 0;}这里只分析迁出:
emigration_handle_ctrl_ack:
cf_queue_push(emig->ctrl_q, &op);
emigration_release(emig);
总结:
1、emigration_send_start函数发送OPERATION_START,目标节点接收到后返回
OPERATION_START_ACK_OK
2、本节点run_fabric_recv函数接收到ACK,并将ACK类型push到emig->ctrl_q队列中
3、emigration_send_start函数从emig->ctrl_q队列pop出接收到的ACK后,退出,进入下一步
4、emigrate_tree函数发送迁移的记录消息OPERATION_INSERT
5、目标节点插入完成,回应OPERATION_INSERT_ACK。
6、emigrate_tree迁移完成后,进入下一步emigration_send_done
7、emigration_send_done发送OPERATION_DONE进入循环等待emig->ctrl_q接收相应;
目标节点接收OPERATION_DONE后,发送OPERATION_DONE_ACK,本阶段接收到ACK退出。
迁移完成。
这里只是迁移的流程框架,具体细节需要结合代码仔细分析
阅读全文
1 0
- Aerospike迁移--2
- Aerospike迁移
- Aerospike系列:2:商业版和社区版的比较
- aerospike安装
- aerospike安装
- aerospike参考资料
- aerospike init
- aerospike参考资料
- aerospike init
- Aerospike系列:3:aerospike特点分析
- Aerospike学习 java语言操作Aerospike
- Aerospike数据库实战(四) -- Aerospike 安装部署
- aerospike特点简单描述
- aerospike与tair对比
- aerospike性能测试
- Aerospike使用介绍
- Aerospike NoSQL 数据库介绍
- aerospike 代码阅读
- 第13章:Java反射机制(day19-day20)
- UIView的frame与bounds
- 机器学习实战(三)kaggle titanic随机森林
- 第14章:网络编程(day20)
- 再见软考
- Aerospike迁移--2
- win10 /Oracle VM VirtualBox 虚拟机ubuntu17.04 NAT host-only网络配置
- 流行排序和佩奇排序简述(manifold rank & Page rank)
- 轻松加精确完成水晶报表对象的对齐、移动及大小调整——使用准线设计
- 201711122215->mysql增加database
- jdk中的LinkedList的实现
- 设计模式-单例模式
- 设计模式,程序员的必经之路
- 菜狗的Python学习笔记 第三章 字符串的使用