ctdb進(jìn)程間通信

ctdbd進(jìn)程通信流程

ctdb_start_daemon
--> ux_socket_bind(ctdb) // 準(zhǔn)備好unix域通信的listen fd
--> ctdb->daemon.sd = socket(AF_UNIX, SOCK_STREAM, 0)
--> bind(ctdb->daemon.sd, (struct sockaddr )&addr, sizeof(addr))
--> listen(ctdb->daemon.sd, 100)
--> tdb_reopen_all(false)
--> ctdb_tcp_init(ctdb); // 初始化tcp通信的相關(guān)方法:
ctdb_tcp_methods變量
--> ctdb->methods->initialise(ctdb)即
ctdb_tcp_initialise*
--> ctdb_tcp_listen(ctdb)
--> struct ctdb_tcp ctcp = talloc_get_type(ctdb->private_data,struct ctdb_tcp);
--> ctcp->listen_fd = socket(sock.sa.sa_family, SOCK_STREAM, IPPROTO_TCP);
--> bind(ctcp->listen_fd, (struct sockaddr * )&sock, sock_size) != 0);
--> listen(ctcp->listen_fd, 10)
--> fde = event_add_fd(ctdb->ev, ctcp, ctcp->listen_fd, EVENT_FD_READ,
ctdb_listen_event, ctdb); // **等待其他ctdbd進(jìn)程tcp通信建鏈**
--> 當(dāng)ctcp->listen_fd變成可讀:ctdb_listen_event
--> fd = accept(ctcp->listen_fd, (struct sockaddr )&addr, &len);
--> struct ctdb_incoming in; in = talloc_zero(ctcp, struct ctdb_incoming); in->fd = fd; in->ctdb = ctdb;
--> in->queue = ctdb_queue_setup(ctdb, in, in->fd, CTDB_TCP_ALIGNMENT, ctdb_tcp_read_cb, in, "ctdbd-%s", incoming_node);
--> ctdb_queue_set_fd(queue, fd)
--> queue->fde = event_add_fd(queue->ctdb->ev, queue, fd, EVENT_FD_READ, queue_io_handler, queue); // 等待對端發(fā)tcp消息過來
--> ctdb_tcp_add_node(ctdb->nodes[i]) // for循環(huán) 初始化主動建鏈需要的相關(guān)結(jié)構(gòu):ctdb->nodes[i]有子成員tnode保存在private_data字段员咽;還有一個子成員queue保存在tnode的out_queue
--> struct ctdb_tcp_node tnode; tnode = talloc_zero(node, struct ctdb_tcp_node);
--> node->private_data = tnode; // 主動建鏈的鏈路信息保存在ctdb->nodes[i].private_data中 // tnode的fd是connectfd和queue的fd相同
--> tnode->out_queue = ctdb_queue_setup(node->ctdb, node, tnode->fd, CTDB_TCP_ALIGNMENT, ctdb_tcp_tnode_cb, node, "to-node-%s", node->name); // 處理tcp鏈路關(guān)閉的包
--> queue = talloc_zero(mem_ctx, struct ctdb_queue); // mem_ctx是第二個參數(shù)即node
--> queue->ctdb = ctdb; queue->fd = fd; queue->private_data = private_data; queue->callback = callback; // private_data是node
--> ctdb_queue_set_fd(queue, fd) // fd是tnode->fd
--> queue->fde = event_add_fd(queue->ctdb->ev, queue, fd, EVENT_FD_READ,
queue_io_handler
, queue); // (1)監(jiān)聽讀事件:被動tcp鏈接的數(shù)據(jù)包
--> ctdb_set_public_addresses(ctdb, true);
--> ctdb_attach_databases(ctdb)
--> fde = event_add_fd(ctdb->ev, ctdb, ctdb->daemon.sd, EVENT_FD_READ, ctdb_accept_client, ctdb); // **等待本節(jié)點recover和cmd工具進(jìn)程unix域通信建鏈**
--> 當(dāng)ctdb->daemon.sd變成可讀 ctdb_accept_client
--> client->queue = ctdb_queue_setup(ctdb, client, fd, CTDB_DS_ALIGNMENT, ctdb_daemon_read_cb, client, "client-%u", client->pid);
--> queue->fd = fd;
--> queue->callback = callback;
--> ctdb_queue_set_fd(queue, fd)
--> queue->fde = event_add_fd(queue->ctdb->ev, queue, fd, EVENT_FD_READ, queue_io_handler, queue); // (2)監(jiān)聽讀事件:recover和cmd工具發(fā)來的unix域數(shù)據(jù)包
--> ctdb->methods->start(ctdb)即ctdb_tcp_start
--> ctdb_tcp_connect_node(ctdb->nodes[i]); // for循環(huán)**主動向其他節(jié)點的ctdbd進(jìn)程建鏈**
--> tnode->connect_te = event_add_timed(ctdb->ev, tnode, timeval_zero(), ctdb_tcp_node_connect, node);
--> ctdb_tcp_node_connect
--> tnode->fd = socket(sock_out.sa.sa_family, SOCK_STREAM, IPPROTO_TCP);
--> bind(tnode->fd, (struct sockaddr )&sock_in, sockin_size)
--> connect(tnode->fd, (struct sockaddr )&sock_out, sockout_size) // tnode->fd是實際讀寫的fd即connectfd
--> tnode->connect_fde = event_add_fd(node->ctdb->ev, tnode, tnode->fd, EVENT_FD_WRITE|EVENT_FD_READ, ctdb_node_connect_write, node); 等待發(fā)送消息包 (3)監(jiān)聽主動建鏈的寫事件
當(dāng)tnode->fd變成可寫即有tcp消息即將發(fā)走:ctdb_node_connect_write
--> ctdb_queue_set_fd(tnode->out_queue, tnode->fd);
--> queue->fd = fd; 等待回的tcp應(yīng)答消息
--> queue->fde = event_add_fd(queue->ctdb->ev, queue, fd, EVENT_FD_READ,
queue_io_handler**, queue); (4)監(jiān)聽主動建鏈的讀事件:收到的數(shù)據(jù)包
--> 當(dāng)收到對端tcp消息queue->fd變成可讀 queue_io_handler
--> queue_io_read(queue)
--> nread = sys_read(queue->fd,queue->buffer.data + queue->buffer.length,num_ready);
--> queue_process(queue);
--> queue->callback(data, pkt_size, queue->private_data);即 ctdb_tcp_read_cb:見前面ctdb_queue_setup
--> in->ctdb->upcalls->recv_pkt(in->ctdb, data, cnt);即ctdb_recv_pkt:main函數(shù)中設(shè)置的
--> **ctdb_input_pkt**(ctdb, hdr); // **ctdbd進(jìn)程收到的tcp消息和recover的消息最終都是它來處理Q刻凇!H!!励堡!**
--> tnode->connect_te = event_add_timed(ctdb->ev, tnode, timeval_current_ofs(1, 0), ctdb_tcp_node_connect, node); 保證對端節(jié)點down再up可以快速重連!1ぬ汀应结!
--> event_loop_wait(ctdb->ev); 阻塞在這里

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市泉唁,隨后出現(xiàn)的幾起案子鹅龄,更是在濱河造成了極大的恐慌,老刑警劉巖亭畜,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扮休,死亡現(xiàn)場離奇詭異,居然都是意外死亡拴鸵,警方通過查閱死者的電腦和手機(jī)玷坠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劲藐,“玉大人八堡,你說我怎么就攤上這事∑肝撸” “怎么了兄渺?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汰现。 經(jīng)常有香客問我挂谍,道長叔壤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任凳兵,我火速辦了婚禮百新,結(jié)果婚禮上企软,老公的妹妹穿的比我還像新娘庐扫。我一直安慰自己,他們只是感情好仗哨,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布形庭。 她就那樣靜靜地躺著,像睡著了一般厌漂。 火紅的嫁衣襯著肌膚如雪萨醒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天苇倡,我揣著相機(jī)與錄音富纸,去河邊找鬼。 笑死旨椒,一個胖子當(dāng)著我的面吹牛晓褪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播综慎,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼涣仿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了示惊?” 一聲冷哼從身側(cè)響起好港,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎米罚,沒想到半個月后钧汹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡录择,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年拔莱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糊肠。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡辨宠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出货裹,到底是詐尸還是另有隱情嗤形,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布弧圆,位于F島的核電站赋兵,受9級特大地震影響笔咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霹期,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一叶组、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧历造,春花似錦甩十、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至臣淤,卻和暖如春橄霉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邑蒋。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工姓蜂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人医吊。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓钱慢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遮咖。 傳聞我的和親對象是個殘疾皇子滩字,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344