Пример #1
0
 def RebalanceCommit(self):
   """Tell servers to commit rebalance changes."""
   # Save rebalance information to a file, so we can recover later.
   rebalance.SaveCommitInformation(self.rebalance)
   body = self.rebalance.SerializeToString()
   size = len(body)
   headers = {"Content-Length": size}
   for i, pool in enumerate(self.rebalance_pool):
     try:
       res = pool.urlopen("POST", "/rebalance/perform", headers=headers,
                          body=body)
       if res.status != constants.RESPONSE_OK:
         logging.error("Server %d failed to perform transaction %s", i,
                       self.rebalance.id)
         self.CancelRebalancing()
         return None
       stat = rdf_data_server.DataServerState()
       stat.ParseFromString(res.data)
       data_server = self.servers[i]
       data_server.UpdateState(stat)
     except urllib3.exceptions.MaxRetryError:
       self.CancelRebalancing()
       return None
   # Update server intervals.
   mapping = self.rebalance.mapping
   for i, serv in enumerate(list(self.mapping.servers)):
     serv.interval = mapping.servers[i].interval
   self.rebalance.mapping = self.mapping
   self.service.SaveServerMapping(self.mapping)
   # We can finally delete the temporary file, since we have succeeded.
   rebalance.DeleteCommitInformation(self.rebalance)
   rebalance.RemoveDirectory(self.rebalance)
   self.CancelRebalancing()
   return self.mapping
Пример #2
0
 def SyncMapping(self, skip=None):
   """Syncs mapping with other servers."""
   pools = []
   try:
     # Update my state.
     self._PeriodicThread()
     for serv in self.servers[1:]:
       if skip and serv in skip:
         continue
       pool = connectionpool.HTTPConnectionPool(serv.Address(),
                                                port=serv.Port())
       pools.append((serv, pool))
     body = self.mapping.SerializeToString()
     headers = {"Content-Length": len(body)}
     for serv, pool in pools:
       res = pool.urlopen("POST", "/servers/sync", headers=headers,
                          body=body)
       if res.status != constants.RESPONSE_OK:
         logging.warning("Could not sync with server %s:%d", serv.Address(),
                         serv.Port())
         return False
       state = rdf_data_server.DataServerState()
       state.ParseFromString(res.data)
       serv.UpdateState(state)
   except urllib3.exceptions.MaxRetryError:
     return False
   finally:
     for _, pool in pools:
       pool.close()
   return True
Пример #3
0
 def GetStatistics(cls):
     """Build statistics object for the server."""
     ok = rdf_data_server.DataServerState.Status.AVAILABLE
     num_components, avg_component = cls.SERVICE.GetComponentInformation()
     stat = rdf_data_server.DataServerState(size=cls.SERVICE.Size(),
                                            load=0,
                                            status=ok,
                                            num_components=num_components,
                                            avg_component=avg_component)
     return stat
Пример #4
0
 def __init__(self, location, index):
   # Parse location.
   loc = urlparse.urlparse(location, scheme="http")
   offline = rdf_data_server.DataServerState.Status.OFFLINE
   state = rdf_data_server.DataServerState(size=0, load=0, status=offline)
   self.server_info = rdf_data_server.DataServerInformation(
       index=index, address=loc.hostname, port=loc.port, state=state)
   self.registered = False
   self.removed = False
   logging.info("Configured DataServer on %s:%d", self.Address(), self.Port())
Пример #5
0
 def _PeriodicThread(self):
   """Periodically update our state and store the mappings."""
   ok = rdf_data_server.DataServerState.Status.AVAILABLE
   num_components, avg_component = self.service.GetComponentInformation()
   state = rdf_data_server.DataServerState(size=self.service.Size(),
                                           load=0,
                                           status=ok,
                                           num_components=num_components,
                                           avg_component=avg_component)
   self.myself.UpdateState(state)
   self.service.SaveServerMapping(self.mapping)
Пример #6
0
 def HandleState(self):
   """Respond to /server/state."""
   if not self.MASTER:
     self._EmptyResponse(constants.RESPONSE_NOT_MASTER_SERVER)
     return
   if not self.data_server:
     logging.error("Server %s attempting to update its state but "
                   "is not registered yet", self.client_address)
     self._EmptyResponse(constants.RESPONSE_SERVER_NOT_REGISTERED)
     return
   state = rdf_data_server.DataServerState(self.post_data)
   self.data_server.UpdateState(state)
   logging.info("Received new state from server %s", self.client_address)
   # Response with our mapping.
   body = self.MAPPING.SerializeToString()
   self._Response(constants.RESPONSE_OK, body)