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