def initialise_hashring(self): """ Initialize the hash ring. If `self.remote_server` is not note, get it from remote_server or else just create a new one. Also set the hash_ring in `self.dht_table` """ if self.remote_server: remote_host, remote_port = self.remote_server.split(":") remote_server = Server(remote_host, remote_port) # Send a join command to the existing server command = DHTCommand(DHTCommand.JOIN, self.this_server) ring = self.client.sendcommand(remote_server, command) logging.debug("got ring from server: %s", str(ring)) # Get replicas if not ring: raise RuntimeError( ("Could not reach server: %s" % str(remote_server))) nodes, replicas = ring.split(",") # Convert |-separated list to Server-instances nodes = map( lambda server_string: Server( server_string.split(":")[0], server_string.split(":")[1]), nodes.split("|")) # Initialize local hash ring self.hash_ring = HashRing(nodes, int(replicas)) self.hash_ring.add_node(self.this_server) else: # First server so this server is added self.hash_ring = HashRing([self.this_server], self.replicas) # Initialize the hash map self.dht_table = MyDHTTable(self.this_server, self.hash_ring)
def gethtml(self): """ Generates a html representation of the map with columns for key, size, time, hash and replicas. """ webpage = StringIO() webpage.write("<html>\n<head><title>DHT status page for " + str(self.server_name) + "</title>\n") webpage.write("</head>\n<body>\nDHT status page for " + str(self.server_name) + "<br />") webpage.write("key count: " + str(len(self._map)) + "</br>") webpage.write("Ring is:<br />") for server in self.hash_ring.get_nodelist(): webpage.write("<a href=http://"+str(server) + ">" + str(server) + "</a><br />") webpage.write("</br>") webpage.write("Number of replicas: " + str(self.hash_ring.replicas) + "<br /><br />") webpage.write("<table border=\"1\">\n<tr>\n<td>key</td>\n<td>size</td>\n<td>time</td>\n<td>hash</td>\n<td>replicas</td></tr>\n") size = 0 for key in self._map.keys(): webpage.write("<tr>\n") webpage.write("<td><a href=/"+ urllib.quote(key) + ">" + key + "</a></td>") size += len(self._map[key]) webpage.write("<td>" + self.getsizewithsuffix(len(self._map[key])) + "</td>") webpage.write("<td>" + str(self._timemap.get(key)) + "</td>") webpage.write("<td>" + str(HashRing().gen_key(key)) + "</td>") webpage.write("<td>") for server in self.hash_ring.get_replicas(key): webpage.write("<a href=http://"+str(server) + "/" + urllib.quote(key) + ">" + str(server) + "</a> ") webpage.write("</td>") webpage.write("</tr>\n") webpage.write("</table>") webpage.write("<br/>Total size: " + self.getsizewithsuffix(size)) webpage.write("</body>\n</html>\n") return webpage.getvalue()