Exemple #1
0
    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)
Exemple #2
0
    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()