点击(此处)折叠或打开
- Description: when SMD start, this algorithm will run as a deamon, two roles: Master,
Slave. When the SMD is elected as a Master role, then, the MPE will be the master MPE accessed by other SMD, and related process data will backup to other
SMD (Slave MPE).
- ctrl: Master or Slave, this value is set by batman-adv;
- ctrl=0, SMD is Slave role;
- ctrl=1, SMD is elected as a Master role;
- changed: Master or Slave, this value is set by batman-adv;
- changed=0, Master SMD is not changed, so, do not need to create thread in MAIN again for data synchronization;
- changed=1, Master SMD is changed, so, need to create thread in MAIN again for data synchronization;
- changed=0;
- is_me=-1;
- prev_state=-1; //0:Slave; 1:Master;
- //READ_CTRL, set URL of application system. Access master_ip in browser.
- PROCEDURE: READ_CTRL
- prev_ip=0.0.0.0;
- while true do
- read the value of ctrl set by batman-adv;
- read master_ip of Master SMD;
- if master_ip==me_ip and is_me!=-1 then
- prev_state=is_me;
- is_me=1;
- else if master_ip!=me_ip and is_me!=-1 then
- prev_state=is_me;
- is_me=0;
- end if
- if master_ip!=prev_ip then
- changed=1;
- prev_ip=master_ip;
- add (or update) "master_ip mpe.localhost" in /etc/hosts;
- end if
- sleep 1s;
- done
- END PROCEDURE READ_CTRL
- //******************************
MAIN Thread
- PROCEDURE: MAIN
- pthread_create(READ_CTRL);
- sleep 1s; //waiting for READ_CTRL to read the value of ctrl and master_ip of Master SMD
- start=1; //set initial state
- while true do
- if start==1 and ctrl==1 then
- start=0;
- is_me=1;
- pthread_create(Master);
- pthread_join(Master);
- else if start==1 and ctrl==0 then
- start=0;
- is_me=0;
- pthread_create(Slave);
- pthread_join(Slave);
- else if start==0 and changed==1 and ctrl==1 then
- pthread_create(Master);
- pthread_join(Master);
- else if start==0 and changed==1 and ctrl==0 then
- sleep(2); //waiting master initialize
- pthread_create(Master);
- pthread_join(Master);
- else //start==0 and changed==0
- continue;
- end if
- done
- END PROCEDURE MAIN
- //******************************
Master Thread
- PROCEDURE: Master
- socket();
- bind();
- listen();
- while true do
- accept(); //waiting for connect from Slave
- pthread_create(M_THREAD);
- done
- END PROCEDURE Master
- //******************************
M_THREAD Thread
- PROCEDURE: M_THREAD
- while true do //communication between Master & Slave
- if database updating then
- send synchronous data to Slave;
- end if
- done
- END PROCEDURE M_THREAD
- //******************************
Slave Thread
- PROCEDURE: Slave
- socket();
- connect();
- while true do
- if receive synchronous data from Master then
- update database;
- end if
- done
- END PROCEDURE Slave