paper4—Multi-MPE_Trigger_Algorithm


    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




posted @ 2016-05-04 20:56  张同光  阅读(94)  评论(0编辑  收藏  举报