Exemplo n.º 1
0
    def _client(self, data, session_id, timeout):
        if session_id is None:
            session_id = self.session_id
        session_id = str(session_id)
        self.endtime = time.time() + timeout
        logging.debug("calling master: %s", self.hosts[0])
        while self.timeout():
            try:
                self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                self.server.settimeout(self.timeout())
                self.server.connect((self.masterid, self.port))

                self.server.settimeout(self.timeout())
                net_send_object(self.server,
                                (session_id, self.hosts, self.timeout()))

                net_send_object(self.server, data)
                self.sync_data = net_recv_object(self.server, self.timeout())
                net_send_object(self.server, "BYE")
                break
            except error.NetCommunicationError:
                logging.warn("Problem with communication with server.")
                self.server.close()
                self.server = None
                time.sleep(1)
            except socket.timeout:
                logging.warn("timeout calling host %s, retry" %
                             (self.masterid))
                time.sleep(1)
            except socket.error as err:
                (code, _) = err
                if (code != errno.ECONNREFUSED):
                    raise
                time.sleep(1)
        if not self.timeout():
            raise error.DataSyncError("Timeout during data sync with data %s" %
                                      (data))
Exemplo n.º 2
0
class SyncData(object):
    """
    Provides data synchronization between hosts.

    Transferred data is pickled and sent to all destination points.
    If there is no listen server it will create a new one. If multiple hosts
    wants to communicate with each other, then communications are identified
    by session_id.
    """
    def __init__(self,
                 masterid,
                 hostid,
                 hosts,
                 session_id=None,
                 listen_server=None,
                 port=13234,
                 tmpdir=None):
        self.port = port
        self.hosts = hosts
        self.session_id = session_id
        self.endtime = None

        self.hostid = hostid
        self.masterid = masterid
        self.master = self.hostid == self.masterid
        self.connection = []
        self.server = None
        self.killserver = False

        self.listen_server = listen_server
        if not self.listen_server and self.master:
            self.listen_server = SyncListenServer(port=self.port,
                                                  tmpdir=tmpdir)
            self.killserver = True

        self.sync_data = {}

    def close(self):
        if self.killserver:
            self.listen_server.close()

    def timeout(self):
        timeout = self.endtime - time.time()
        if timeout < 0:
            timeout = 0
        return timeout

    def _client(self, data, session_id, timeout):
        if session_id is None:
            session_id = self.session_id
        session_id = str(session_id)
        self.endtime = time.time() + timeout
        logging.info("calling master: %s", self.hosts[0])
        while self.timeout():
            try:
                self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                self.server.settimeout(self.timeout())
                self.server.connect((self.masterid, self.port))

                self.server.settimeout(self.timeout())
                net_send_object(self.server,
                                (session_id, self.hosts, self.timeout()))

                net_send_object(self.server, data)
                self.sync_data = net_recv_object(self.server, self.timeout())
                net_send_object(self.server, "BYE")
                break
            except error.NetCommunicationError:
                logging.warn("Problem with communication with server.")
                self.server.close()
                self.server = None
                time.sleep(1)
            except socket.timeout:
                logging.warn("timeout calling host %s, retry" %
                             (self.masterid))
                time.sleep(1)
            except socket.error, err:
                (code, _) = err
                if (code != errno.ECONNREFUSED):
                    raise
                time.sleep(1)
        if not self.timeout():
            raise error.DataSyncError("Timeout during data sync with data %s" %
                                      (data))