ZooKeeperによるサービス発見の実装(C++)

リポジトリ:git@github.com:ccx19930930/services_register_and_discovery.git

参考リンク:https://www.cnblogs.com/haippy/archive/2013/02/21/2920280.html

down_service_mgr.h

 1 #ifndef _DOWN_SERVICE_MANAGER_H_
 2 #define _DOWN_SERVICE_MANAGER_H_
 3 
 4 #include "base_class.h"
 5 
 6 class CDownServiceManager : CUnCopyable
 7 {
 8 public:
 9     CDownServiceManager(int module_id) : m_module_id(module_id) {}
10     ~CDownServiceManager() {}
11 private:
12     CDownServiceManager() {}
13 
14 public:
15     int Register(const string& zk_path, CNodeInfo* node_info);
16     int UnRegister(const string& zk_path);
17 
18 private:
19     int m_module_id;
20     map<string, CNodeInfo *> m_node_map;
21     pthread_mutex_t m_mutex;
22 };
23 
24 #endif

down_service_mgr.cpp

 1 #include "down_service_mgr.h"
 2 #include "auto_lock.h"
 3 
 4 int CDownServiceManager::Register(const string& zk_path, CNodeInfo* node_info)
 5 {
 6     CAutoMutexLock auto_lock(m_mutex);
 7     if (m_node_map.count(zk_path))
 8     {
 9         return -1;
10     }
11     m_node_map[zk_path] = node_info;
12     //TODO 長接続の処理など
13 
14     return 0;
15 }
16 
17 int CDownServiceManager::UnRegister(const string& zk_path)
18 {
19     CAutoMutexLock auto_lock(m_mutex);
20     if (m_node_map.count(zk_path) == 0)
21     {
22         return -1;
23     }
24     //TODO 長接続の処理など
25 
26     m_node_map.erase(zk_path);
27     return 0;
28 }

discovery.h

 1 #ifndef _SERVICE_DISCOVERY_H_
 2 #define _SERVICE_DISCOVERY_H_
 3 
 4 #include "base_class.h"
 5 #include "zk_handle.h"
 6 #include "down_service_mgr.h"
 7 
 8 #include <zookeeper.jute.h>
 9 
10 class CDownNode
11 {
12 public:
13     CDownNode() { Reset(); }
14     ~CDownNode() {}
15 
16     void Reset()
17     {
18         m_is_full_node = false;
19         m_node_info.Reset();
20         m_node_map.clear();
21         m_invalid_node_path_set.clear();
22     }
23 
24 public:
25     bool m_is_full_node;
26     CNodeInfo m_node_info;
27 
28     map<string, CNodeInfo> m_node_map;
29     set<string> m_invalid_node_path_set;
30 
31 };
32 
33 class CServiceDiscovery : public CUnCopyable
34 {
35 private:
36     static pthread_mutex_t m_mutex;
37     static CServiceDiscovery* m_instance;
38     CServiceDiscovery();
39 public:
40     static CServiceDiscovery* GetInstance();
41     int Init(const set<string> & service_path_list, const set<int> & service_id_list);
42 
43 
44 public:
45     int StartMonitoring();
46     int Stop();
47     static void OnZkHandleResetFunc();
48 
49 private:
50     static void* DiscoveryMonitorThread(void * param);
51     int DiscoveryMonitor();
52     int ServicePathCheck();
53     int InvalidNodeCheck();
54     int DebugPrintAllNode();
55     bool IsRunning();
56 
57 private:
58     static void ZkPathWatcher(zhandle_t* zh, int type, int state, const char* path, void* watcherCtx);
59     static void ZkNodeWatcher(zhandle_t* zh, int type, int state, const char* path, void* watcherCtx);
60 
61 private:
62     int OnPathChange(string path);
63     int OnNodeChange(string node);
64     void OnZkHandleReset();
65     
66 private:
67     pthread_t m_monitor_thread_id;
68     bool m_is_running;
69     map<string, CDownNode*> m_service_path_list; // <zk_path, down_node_info>
70     map<string, string> m_path_to_directory;    // <zk_node, zk_node>
71     map<int, CDownServiceManager* > m_service_manager_list;
72 };
73 
74 #endif

discovery.cpp

  1 #include "discovery.h"
  2 #include "auto_lock.h"
  3 
  4 #include <stdlib.h>
  5 #include <sys/prctl.h>
  6 #include <unistd.h>
  7 #include <pthread.h>
  8 
  9 CServiceDiscovery* CServiceDiscovery::m_instance = nullptr;
10 pthread_mutex_t CServiceDiscovery::m_mutex;
11 
12 CServiceDiscovery::CServiceDiscovery()
13     : m_is_running(false)
14     , m_monitor_thread_id(0)
15 {
16 }
17 
18 CServiceDiscovery* CServiceDiscovery::GetInstance()
19 {
20     if (m_instance == nullptr)
21     {
22         CAutoMutexLock auto_lock(m_mutex);
23         if (m_instance == nullptr)
24         {
25             m_instance = new CServiceDiscovery;
26         }
27     }
28     return m_instance;
29 }
30 
31 int CServiceDiscovery::Init(const set<string>& service_path_list, const set<int>& service_id_list)
32 {
33     CAutoMutexLock auto_lock(m_mutex);
34     for (const auto & zk_path : service_path_list)
35     {
36         m_service_path_list[zk_path] = new CDownNode;
37     }
38 
39     for (const auto& module_id : service_id_list)
40     {
41         m_service_manager_list[module_id] = new CDownServiceManager(module_id);
42     }
43 
44     return 0;
45 }
46 
47 int CServiceDiscovery::StartMonitoring()
48 {
49     if (0 == m_monitor_thread_id)
50     {
51         m_is_running = true;
52         if (0 != pthread_create(&m_monitor_thread_id, nullptr, CServiceDiscovery::DiscoveryMonitorThread, nullptr))
53         {
54             printf("サービス監視スレッドの作成に失敗しました。");
55             return -1;
56         }
57         printf("サービス監視スレッドの作成に成功しました。");
58     }
59     return 0;
60 }
61 
62 int CServiceDiscovery::Stop()
63 {
64     m_is_running = false;
65 }
66 
67 void CServiceDiscovery::OnZkHandleResetFunc()
68 {
69     CServiceDiscovery::GetInstance()->OnZkHandleReset();
70 }
71 
72 void* CServiceDiscovery::DiscoveryMonitorThread(void* param)
73 {
74     prctl(PR_SET_NAME, "zk_discovery_monitor");
75 
76     CZkHandle::GetInstance()->AddResetHandleFn("discovery", CServiceDiscovery::OnZkHandleResetFunc);
77 
78     while (true == CServiceDiscovery::GetInstance()->IsRunning())
79     {
80         CServiceDiscovery::GetInstance()->DiscoveryMonitor();
81         usleep(kZkDiscoveryIntervalTime);
82     }
83     return nullptr;
84 }
85 
86 int CServiceDiscovery::DiscoveryMonitor()
87 {
88     ServicePathCheck();
89     InvalidNodeCheck();
90 
91 #ifdef _DEBUG_
92     DebugPrintAllNode();
93 #endif
94 }
95 
96 int CServiceDiscovery::ServicePathCheck()
97 {
98     printf("%s =======================================================\n", __func__);
99     CAutoMutexLock auto_lock(m_mutex);
100     for (const auto& service_path : m_service_path_list)
101     {
102         CDownNode* down_node = service_path.second;
103         if (down_node->m_is_full_node)
104         {
105             continue;
106         }
107         set<string> node_list;
108         if (ZOK == CZkHandle::GetInstance()->ZkWgetChildren(service_path.first, CServiceDiscovery::ZkPathWatcher, node_list))
109         {
110             for (auto node_path : node_list)
111             {
112                 down_node->m_invalid_node_path_set.insert(service_path.first + '/' + node_path);
113             }
114             for (const auto& node : down_node->m_node_map)
115             {
116                 down_node->m_invalid_node_path_set.insert(node.first);
117             }
118 
119             down_node->m_is_full_node = true;
120         }
121     }
122     return 0;
123 }
124 
125 int CServiceDiscovery::InvalidNodeCheck()
126 {
127     printf("%s =======================================================\n", __func__);
128     CAutoMutexLock auto_lock(m_mutex);
129     for (const auto& service_path : m_service_path_list)
130     {
131         CDownNode* down_node = service_path.second;
132         for (auto it_node_path = down_node->m_invalid_node_path_set.begin(); it_node_path != down_node->m_invalid_node_path_set.end();)
133         {
134             struct Stat stat;
135             string zk_node_info;
136             int ret_code = CZkHandle::GetInstance()->ZkWGetNodeInfo(*it_node_path, CServiceDiscovery::ZkNodeWatcher, zk_node_info, stat);
137             if (ZOK == ret_code)
138             {
139                 CNodeInfo node_info;
140                 node_info.FromString(zk_node_info);
141                 down_node->m_node_map[*it_node_path] = node_info;
142                 it_node_path = down_node->m_invalid_node_path_set.erase(it_node_path);
143                 m_service_manager_list[atoi(node_info.m_module_id.c_str())]->Register(*it_node_path, &node_info);
144                 m_path_to_directory[*it_node_path] = service_path.first;
145             }
146             else if(ZNONODE == ret_code)
147             {
148                 if (down_node->m_node_map.count(*it_node_path))
149                 {
150                     CNodeInfo& node_info = down_node->m_node_map[*it_node_path];
151                     m_service_manager_list[atoi(node_info.m_module_id.c_str())]->UnRegister(*it_node_path);
152                     down_node->m_node_map.erase(*it_node_path);
153                 }
154                 if (m_path_to_directory.count(*it_node_path))
155                 {
156                     m_path_to_directory.erase(*it_node_path);
157                 }
158                 it_node_path = down_node->m_invalid_node_path_set.erase(it_node_path);
159             }
160             else
161             {
162                 ++it_node_path;
163             }
164         }
165     }
166     return 0;
167 }
168 
169 int CServiceDiscovery::DebugPrintAllNode()
170 {
171     printf("%s =======================================================\n", __func__);
172     CAutoMutexLock auto_lock(m_mutex);
173     for (const auto& service_path : m_service_path_list)
174     {
175         printf("%s service_path=%s is_full_node=%d --------------------------------------------\n", __func__, service_path.first.c_str(), service_path.second->m_is_full_node);
176         printf("%s node_map: \n", __func__);
177         for (auto& down_node : service_path.second->m_node_map)
178         {
179             printf("%s node=%s \n", __func__, down_node.first.c_str());
180             printf("%s info=%s \n", __func__, down_node.second.ToString().c_str());
181         }
182 
183         printf("%s invalid_node_set: \n", __func__);
184         for (const auto& invalid_node : service_path.second->m_invalid_node_path_set)
185         {
186             printf("%s invalid_node:%s \n", __func__, invalid_node.c_str());
187         }
188     }
189     return 0;
190 }
191 
192 bool CServiceDiscovery::IsRunning()
193 {
194     return m_is_running;
195 }
196 
197 void CServiceDiscovery::ZkPathWatcher(zhandle_t* zh, int type, int state, const char* path, void* watcherCtx)
198 {
199     if (ZOO_CHILD_EVENT == type)
200     {
201         CServiceDiscovery::GetInstance()->OnPathChange(path);
202     }
203 }
204 
205 void CServiceDiscovery::ZkNodeWatcher(zhandle_t* zh, int type, int state, const char* path, void* watcherCtx)
206 {
207     if (ZOO_CHANGED_EVENT == type)
208     {
209         CServiceDiscovery::GetInstance()->OnNodeChange(path);
210     }
211     else if (ZOO_DELETED_EVENT == type)
212     {
213         CServiceDiscovery::GetInstance()->OnNodeChange(path);
214     }
215 }
216 
217 int CServiceDiscovery::OnPathChange(string path)
218 {
219     printf("%s path=%s  =======================================================\n", __func__, path.c_str());
220     CAutoMutexLock auto_lock(m_mutex);
221     if (m_service_path_list.count(path))
222     {
223         m_service_path_list[path]->m_is_full_node = false;
224     }
225     return 0;
226 }
227 
228 int CServiceDiscovery::OnNodeChange(string node)
229 {
230     printf("%s node=%s  =======================================================\n", __func__, node.c_str());
231     CAutoMutexLock auto_lock(m_mutex);
232     string path;
233     if (m_path_to_directory.count(node))
234     {
235         path = m_path_to_directory[node];
236     }
237     if (m_service_path_list.count(path))
238     {
239         m_service_path_list[path]->m_invalid_node_path_set.insert(node);
240     }
241     return 0;
242 }
243 
244 void CServiceDiscovery::OnZkHandleReset()
245 {
246     printf("%s =======================================================\n", __func__);
247     CAutoMutexLock auto_lock(m_mutex);
248     for (const auto& service_path : m_service_path_list)
249     {
250         service_path.second->m_is_full_node = false;
251     }
252 }

View Codediscovery_test main.cpp

 1 #include "../zk_util/zk_handle.h"
 2 #include "../zk_util/discovery.h"
 3 
 4 #include <unistd.h>
 5 
 6 //疑似分散環境のホストリストは、通常は設定ファイル形式で記述するが、ここではテストプログラムのため固定値を使用
 7 const char* host_list = "xx.xx.xx.xx:port,xx.xx.xx.xx:port,xx.xx.xx.xx:port";
 8 const int time_out = 3000;
 9 int main()
10 {
11     CZkHandle::GetInstance()->ZkInit(host_list, time_out);
12 
13     set<string> service_path_list;
14     service_path_list.insert("/zk_test1");
15     service_path_list.insert("/zk_test2");
16 
17     set<int> service_id_list;
18     service_id_list.insert(1);
19     service_id_list.insert(2);
20 
21     CServiceDiscovery::GetInstance()->Init(service_path_list, service_id_list);
22     CServiceDiscovery::GetInstance()->StartMonitoring();
23 
24     sleep(60);
25 
26     return 0;
27 }

Makefile

 1 INC_DIR:= ./ ../zk_util/ /usr/local/include/zookeeper/ /usr/local/include/json/
 2 SRCS:= $(wildcard ./*cpp ../zk_util/*cpp)
 3 OBJS:= $(patsubst %.cpp, %.o, $(SRCS))
 4 LIBS:= -lpthread -lzookeeper_mt -ljsoncpp
 5 
 6 CXX:= g++
 7 
 8 CXXFLAGS:= -w -g -std=c++11 $(addprefix -I, $(INC_DIR)) $(LIBS) -Wl,-rpath="/usr/local/lib" -D _DEBUG_
 9 
10 EXE:= ../../bin/discovery_test
11 
12 $(EXE):$(OBJS)
13     $(CXX) -o $(EXE) $(OBJS) $(CXXFLAGS)
14 
15 clean:
16     rm -rf $(EXE)
17     rm -rf $(OBJS)

実行結果:

discovery_testのみ実行

ccx@ccx:~/self_test/zookeeper/services_register_and_discovery/bin$ ./discovery_test 
CZkHandle::ZkInit 登録確認スレッドの作成に成功しました。
CServiceDiscovery::StartMonitoring サービス監視スレッドの作成に成功しました。CZkHandle::ResetZkHandle: ZooKeeperへの接続に成功しました。
ServicePathCheck =======================================================
CZkHandle::ZkWgetChildren path=/zk_test1の子ノードを取得
CZkHandle::ZkInitWatchar: [type=-1] [state=3] [path=] [watcher_ctx=(nil)]
CZkHandle::ZkWgetChildren 子ノードの取得に成功しました。children_num=0
CZkHandle::ZkWgetChildren path=/zk_test2の子ノードを取得
CZkHandle::ZkWgetChildren 子ノードの取得に成功しました。children_num=0
InvalidNodeCheck =======================================================
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
ServicePathCheck =======================================================
InvalidNodeCheck =======================================================
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
ServicePathCheck =======================================================
InvalidNodeCheck =======================================================
DebugPrintAllNode =======================================================

register_test_1.confを使用して複数のテストプログラムを起動後

ServicePathCheck =======================================================
InvalidNodeCheck =======================================================
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
OnPathChange path=/zk_test1  =======================================================
ServicePathCheck =======================================================
CZkHandle::ZkWgetChildren path=/zk_test1の子ノードを取得
CZkHandle::ZkWgetChildren 子ノードの取得に成功しました。children_num=1
CZkHandle::ZkWgetChildren children_idx=0, children_name=register_test_1
InvalidNodeCheck =======================================================
CZkHandle::ZkWGetNodeInfo path=/zk_test1/register_test_1のノード情報を取得
CZkHandle::ZkWGetNodeInfo path=/zk_test1/register_test_1のノード情報取得成功。buffer=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test1] MODULE_NAME[register_test] MODULE_ID[1] MODULE_IDX[1] 
CZkHandle::ZkWGetNodeInfo: [path=/zk_test1/register_test_1] [czxid=17179873794] [mzxid=17179873794] [version=0] [cversion=0] [child_num=0]
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test1/register_test_1 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test1] MODULE_NAME[register_test] MODULE_ID[1] MODULE_IDX[1]  
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
ServicePathCheck =======================================================
InvalidNodeCheck =======================================================
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test1/register_test_1 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test1] MODULE_NAME[register_test] MODULE_ID[1] MODULE_IDX[1]  
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]

register_test_2.confを使用して複数のテストプログラムを起動後

ServicePathCheck =======================================================
InvalidNodeCheck =======================================================
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test1/register_test_1 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test1] MODULE_NAME[register_test] MODULE_ID[1] MODULE_IDX[1]  
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
OnPathChange path=/zk_test2  =======================================================
ServicePathCheck =======================================================
CZkHandle::ZkWgetChildren path=/zk_test2の子ノードを取得
CZkHandle::ZkWgetChildren 子ノードの取得に成功しました。children_num=1
CZkHandle::ZkWgetChildren children_idx=0, children_name=register_test_20000000010
InvalidNodeCheck =======================================================
CZkHandle::ZkWGetNodeInfo path=/zk_test2/register_test_20000000010のノード情報を取得
CZkHandle::ZkWGetNodeInfo path=/zk_test2/register_test_20000000010のノード情報取得成功。buffer=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2] 
CZkHandle::ZkWGetNodeInfo: [path=/zk_test2/register_test_20000000010] [czxid=17179873868] [mzxid=17179873868] [version=0] [cversion=0] [child_num=0]
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test1/register_test_1 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test1] MODULE_NAME[register_test] MODULE_ID[1] MODULE_IDX[1]  
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test2/register_test_20000000010 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2]  
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
ServicePathCheck =======================================================
InvalidNodeCheck =======================================================
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test1/register_test_1 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test1] MODULE_NAME[register_test] MODULE_ID[1] MODULE_IDX[1]  
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test2/register_test_20000000010 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2]  
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
OnPathChange path=/zk_test2  =======================================================
ServicePathCheck =======================================================
CZkHandle::ZkWgetChildren path=/zk_test2の子ノードを取得
CZkHandle::ZkWgetChildren 子ノードの取得に成功しました。children_num=2
CZkHandle::ZkWgetChildren children_idx=0, children_name=register_test_20000000010
CZkHandle::ZkWgetChildren children_idx=1, children_name=register_test_20000000011
InvalidNodeCheck =======================================================
CZkHandle::ZkWGetNodeInfo path=/zk_test2/register_test_20000000010のノード情報を取得
CZkHandle::ZkWGetNodeInfo path=/zk_test2/register_test_20000000010のノード情報取得成功。buffer=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2] 
CZkHandle::ZkWGetNodeInfo: [path=/zk_test2/register_test_20000000010] [czxid=17179873868] [mzxid=17179873868] [version=0] [cversion=0] [child_num=0]
CZkHandle::ZkWGetNodeInfo path=/zk_test2/register_test_20000000011のノード情報を取得
CZkHandle::ZkWGetNodeInfo path=/zk_test2/register_test_20000000011のノード情報取得成功。buffer=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2] 
CZkHandle::ZkWGetNodeInfo: [path=/zk_test2/register_test_20000000011] [czxid=17179873873] [mzxid=17179873873] [version=0] [cversion=0] [child_num=0]
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test1/register_test_1 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test1] MODULE_NAME[register_test] MODULE_ID[1] MODULE_IDX[1]  
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test2/register_test_20000000010 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2]  
DebugPrintAllNode node=/zk_test2/register_test_20000000011 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2]  
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]

順にregister_testを停止

ServicePathCheck =======================================================
InvalidNodeCheck =======================================================
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test1/register_test_1 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test1] MODULE_NAME[register_test] MODULE_ID[1] MODULE_IDX[1]  
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test2/register_test_20000000014 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2]  
DebugPrintAllNode node=/zk_test2/register_test_20000000015 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2]  
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
OnNodeChange node=/zk_test1/register_test_1  =======================================================
OnPathChange path=/zk_test1  =======================================================
ServicePathCheck =======================================================
CZkHandle::ZkWgetChildren path=/zk_test1の子ノードを取得
CZkHandle::ZkWgetChildren 子ノードの取得に成功しました。children_num=0
InvalidNodeCheck =======================================================
CZkHandle::ZkWGetNodeInfo path=/zk_test1/register_test_1のノード情報を取得
CZkHandle::ZkWGetNodeInfo path=/zk_test1/register_test_1のノード情報取得に失敗。ret=-101
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test2/register_test_20000000014 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2]  
DebugPrintAllNode node=/zk_test2/register_test_20000000015 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2]  
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
ServicePathCheck =======================================================
InvalidNodeCheck =======================================================
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode node=/zk_test2/register_test_20000000014 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2]  
DebugPrintAllNode node=/zk_test2/register_test_20000000015 
DebugPrintAllNode info=IP[127.0.0.1] PORT[12345] ZK_PATH[/zk_test2] MODULE_NAME[register_test] MODULE_ID[2] MODULE_IDX[2]  
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
OnNodeChange node=/zk_test2/register_test_20000000015  =======================================================
OnPathChange path=/zk_test2  =======================================================
OnNodeChange node=/zk_test2/register_test_20000000014  =======================================================
ServicePathCheck =======================================================
CZkHandle::ZkWgetChildren path=/zk_test2の子ノードを取得
CZkHandle::ZkWgetChildren 子ノードの取得に成功しました。children_num=0
InvalidNodeCheck =======================================================
CZkHandle::ZkWGetNodeInfo path=/zk_test2/register_test_20000000014のノード情報を取得
CZkHandle::ZkWGetNodeInfo path=/zk_test2/register_test_20000000014のノード情報取得に失敗。ret=-101
CZkHandle::ZkWGetNodeInfo path=/zk_test2/register_test_20000000015のノード情報を取得
CZkHandle::ZkWGetNodeInfo path=/zk_test2/register_test_20000000015のノード情報取得に失敗。ret=-101
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]
ServicePathCheck =======================================================
InvalidNodeCheck =======================================================
DebugPrintAllNode =======================================================
DebugPrintAllNode service_path=/zk_test1 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
DebugPrintAllNode service_path=/zk_test2 is_full_node=1 --------------------------------------------
DebugPrintAllNode node_map: 
DebugPrintAllNode invalid_node_set: 
CZkHandle::ZkExists: [ret=0]
CZkHandle::ZkExists: [path=/] [czxid=0] [mzxid=0] [version=0] [cversion=291] [child_num=5]

タグ: ZooKeeper C++ サービス発見 分散システム

6月14日 22:49 投稿