Monday, 7 February 2011

Ολοκλήρωση Routing - State Update

Κατά τις προηγούμενες μέρες ολοκληρώθηκαν αρκετά κομμάτια κώδικα, παραλείψαμε όμως να ενημερώσουμε τακτικά το blog.Παρακάτω ακολουθούν τα τμήματα κώδικα που υλοποιήθηκαν.


Δημιουργία Κώδικα RMI

Δημιουργήθηκαν 2 κλάσεις που πραγματοποιούν την επικοινωνία μεταξύ κόμβων μέσω RMI, καθώς και μια διεπαφή.

Το τμήμα κώδικα αυτό χρησιμοποιείται κατά το bootstrap, για την διαδικασία της Άφιξης Κόμβου στον δαχτύλιο, κατά την οποία ο νέος κόμβος χτίζει την κατάστασή του, και για την διαδικασία της Ενημέρωσης Ύπαρξης, κατά την οποία οι κόμβοι στην κατάσταση του νέου κόμβου ενημερώνουν με τη σειρά τους τις δικές τους καταστάσεις.

Κάθε κόμβος του προγράμματος θα έχει ένα μοναδικό bindname και θα έχει ένα thread που θα τρέχει αποκλειστικά το κομμάτι για τον RMI server. Κάθε κόμβος επίσης ,όποτε χρειάζεται, θα σηκώνει ένα νέο RMIRegistry σε διαφορετική θύρα από του server, το οποίο θα χρησιμοποιείται από την client πλευρά της επικοινωνίας μέσω RMI.

Δημιουργήθηκε επίσης μια κλάση που θα αναπαριστά το μήνυμα που στέλνει ένας νέος κόμβος που θέλει να εισέλθει στον δαχτύλιο, και το οποίο έχει προορισμό τον κόμβο με το κοντινότερο ID στον νέο κόμβο.



Δημιουργία State Κόμβου

Δημιουργήθηκαν 3 κλάσεις οι οποίες αναπαριστούν τους 3 πίνακες της κατάστασης ενός κόμβου (Leaf Set, Routing Table, Neighborhood Set).

Τα 3 σετ έχουν υλοποιηθεί με πίνακες. Οι κλάσεις υλοποιούν την διεπαφή Serializable,καθώς κάθε κόμβος πρέπει να μπορεί να στείλει την κατάστασή του σε κάποιον άλλον (μέσω RMI).
 

Επίσης, ολοκληρώθηκαν οι βασικές κλάσεις των κόμβων (Node, NodeImpl, NodeInfo).
  • Η Node είναι ένα interface για την υλοποίηση του κόμβου (NodeImpl).
  • Η NodeInfo περιέχει το ID του κόμβου, την IP address και το bindname του.
  • Η NodeImpl περιέχει το NodeInfo του κόμβου, καθώς και τους 3 πίνακες της κατάστασής του (Leaf Set, Routing Table, Neighborhood Set).

**Υπενθύμιση:    Στην υλοποίησή μας του Pastry, θεωρούμε το b = 4. Άρα θα έχουμε
                         2^b = 16 στήλες στο Routing Table, και 2*2^b = 32 σειρές στα
                         Leaf Set και Neighborhood Set.  Οι σειρές του Routing Table δεν
                         θα έχουν σταθερό αριθμό, θα είναι όμως το πολύ 32, όσα και τα
                         ψηφία των node ID.




Δημιουργία Κώδικα Routing

Δημιουργήθηκε ο κώδικας για τον αλγόριθμο του routing, όπως περιγράφεται στο paper του Pastry (http://research.microsoft.com/en-us/um/people/antr/PAST/pastry.pdf).

Στη συνέχεια τροποποιήθηκε ώστε, αν τα μηνύματα που πρέπει να κάνει route αφορούν το αίτημα εισόδου ενός νέου κόμβου στον δαχτύλιο, να στέλνει στον νέο κόμβο τα τμήματα της κατάστασής του που πρέπει να στείλει ο συγκεκριμένος κόμβος (αν είναι ο bootstrap, το Neighborhood Set του και την 1η γραμμή του Routing Table του, αν είναι ο κόμβος με το κοντινότερο ID, το Leaf Set του και την τελευταία γραμμή του Routing Table του, ή αν είναι  κάποιος κόμβος της διαδρομής, την γραμμή του Routing Table του που αντιστοιχεί).

Δημιουργήθηκε επίσης μια μέθοδος που βρίσκει το common prefix μεταξύ 2 node IDs.



Δημιουργία Κώδικα Κατασκευής State


Δημιουργήθηκε ο κώδικας που κατασκευάζει την κατάσταση του νεοεισερχόμενου στον δαχτύλιο κόμβου.

Ο κόμβος λαμβάνει ειδικά μηνύματα που περιέχουν κομμάτια καταστάσεων, στον RMI server του, και αυτό ανάλογα με το τι περιέχει το μήνυμα καλεί τις κατάλληλες μέθόδους που θα χτίσουν τους πίνακες της κατάστασης του νέου κόμβου.

Το Leaf Set χτίζεται από το αντίστοιχο του κόμβου με το κοντινότερο ID στον νέο κόμβο.Στο σύνολο των στοιχείων του set  του κοντινότερου κόμβου, προστίθεται το NodeInfo του κοντινότερου, και από αυτούς επιλέγονται μέχρι 16 μεγαλύτεροι κόμβοι και μέχρι 16 μικρότεροι, με το κοντινότερο ID στον νέο.

Το Neighborhood Set χτίζεται από το αντίστοιχο του bootstrap κόμβου.Από αυτό, αν έχει 32 κόμβους, αφαιρούμε randomly έναν κόμβο και προσθέτουμε μέσα το NodeInfo του bootstrap κόμβου.Αν πάλι έχουμε λιγότερα από 32 στοιχεία, απλά προσθέτουμε το NodeInfo του bootstrap κόμβου.

Το Routing Table χτίζεται εύκολα. Απλά τοποθετούμε μαζί όλες τις γραμμές που έχουμε λάβει από τους κόμβους που λάβαν το JoinMsg., και διμιουργούμε ένα καινούριο.

Επίσης δημιουργήθηκε μια κλάση μηνυμάτων, με τα οποία αποστέλλονται στον νέο κόμβο τα τμήματα κατάστασης από τα οποία αυτός θα χτίσει την δική του.



Δημιουργία Κώδικα Update State

Δημιουργήθηκε το κομμάτι κώδικα που ανανεώνει το state ενός κόμβου, για την είσοδο ενός νέου κόμβου στον δαχτύλιο (φάση Ενημέρωση Ύπαρξης Νέου Κόμβου).

Όταν ο νέος κόμβος δημιουργήσει την κατάστασή του, τότε αποστέλει ένα μήνυμα με την κατάστασή του σε όλους τους κόμβους που περιέχονται σε αυτή.

Όταν ένας κόμβος λάβει ένα τέτοιο μήνυμα, ανανεώνει το Leaf Set του και το Routing Table του.

Το Leaf Set του το ανανεώνει με τον ίδιο τρόπο με τον οποίο ένας νέος κόμβος χτίζει το Leaf Set του.

Για το Routing Table του, ο κόμβος προσπαθεί να καλύψει τυχόν κενά που έχει μέσα σε αυτό.Έτσι ελέγχει τους κόμβους που περιέχονται σε ολόκληρη την κατάσταση που του στάλθηκε, και αν κάποιο NodeInfo ταιριάζει στην συγκεκριμένη θέση του Routing Table, τοποθετείται.

Επίσης δημιουργήθηκε μια κλάση μηνυμάτων για τη μεταφορά ενός ολόκληρου state κόμβου.

Saturday, 8 January 2011

Δημιουργία Κώδικα Multicast

Δημιουργήθηκαν 2 κλάσεις με στατικές μεθόδους, που πραγματοποιούν την διαδικασία του multicast για την εύρεση ενός bootstrap κόμβου. 

Κάθε κόμβος του προγράμματος θα έχει ένα thread που θα τρέχει αποκλειστικά το κομμάτι για bootstrap server, και θα απαντάει σε κάθε multicast μήνυμα που λαμβάνει. Ο αποστολέας θα κρατάει μόνο την πρώτη απάντηση που έλαβε, η οποία συνήθως θα προέρχεται από τον πιο κοντινό κόμβο.

Επίσης  τροποποιήθηκε ο τρόπος υπολογισμού του nodeID. Εκτός από την ip και το port, συμπεριλάβαμε και το processID, ώστε να μπορούμε να τρέχουμε πολλούς κόμβους από τον ίδιο υπολογιστή.

Tuesday, 14 December 2010

Δημιουργία Κώδικα Κατακερματισμού

Σήμερα  δημιουργήθηκε μια κλάση με στατικές μεθόδους, για την εισαγωγή ενός String (IP address + port του κόμβου), με χρήση της συνάρτησης SHA-1. Από τα 160bit που δημιουργεί η SHA-1, κρατάμε τα 128 πρώτα.

Επίσης, ξεκίνησε η συγγραφή των βασικών κλάσεων της εφαρμογής (Node,NodeImpl,NodeInfo).

Αρχιτεκτονική του Συστήματος

Στα πλαίσια της εργασίας, θα πραγματοποιήσουμε μια υλοποίηση του peer-2-peer
συστήματος “Pastry”


Γενικά

Στο σύστημά μας, όπως και στο “Pastry”, οι κόμβοι θα είναι οργανωμένοι σε έναν
δαχτύλιο, και κάθε κόμβος θα έχει ένα μοναδικό 128-bit nodeID. Για την παραγωγή αυτών των nodeID θα χρησιμοποιηθεί η συνάρτηση SHA-1, με είσοδο IP θύρες/ TCP διευθύνσεις ενός κόμβου.

Ο κάθε κόμβος θα κρατάει μια λίστα από Leaf Nodes, δηλαδή τους κοντινότερους κόμβους με βάση το nodeID, μια λίστα από Neighborhood Nodes, δηλαδή τους κοντινότερους κόμβους με βάση κάποια μετρική δρομολόγησης, και έναν πίνακα δρομολόγησης (Routing Table), που περιέχει τα nodeID των πλησιέστερων γνωστών κόμβων.
Παρακάτω αναφέρονται από ένα mini σενάριο για κάθε περίπτωση, καθώς και ποιες
δομοενότητες λογισμικού προβλέπεται να χρησιμοποιηθούν σε κάθε περίπτωση.

 

Αρχικοποίηση και Εισαγωγή Κόμβου

Όταν κάποιος νέος κόμβος θέλει να εισέλθει στον δαχτύλιο, τότε, αφού αποκτίσει δικό του nodeID από την συνάρτηση SHA-1, κάνει multicast στον δαχτύλιο κάποιο ειδικό αίτημα «εισαγωγής» (join). Ο κόμβος που θα απαντήσει (ή οι κόμβοι), θα αποστείλει σε ένα πακέτο το nodeID του κόμβου που θέλει να εισέλθει μαζί με το μήνυμα “join” προς τον κόμβο που έχει το κοντινότερο nodeID στο αντίστοιχο του νεοεισερχόμενου. Στη συνέχεια, ο κόμβος που απάντησε στην αίτηση, ο κόμβος-τελικός παραλήπτης του μηνύματος και όλοι οι ενδιάμεσοι προωθητές του μηνύματος, αποστέλνουν την «κατάστασή» τους στον νεοεισερχόμενο κόμβο. Τέλος ο νεοεισερχόμενος κόμβος χρησιμοποιεί αυτές τις καταστάσεις για να χτίσει την δική του κατάσταση.


Εισαγωγή και Αντιστοίχιση Αντικειμένου

Για να εισάγουμε και να αντιστοιχίσουμε ένα αντικείμενο σε έναν κόμβο, δίνουμε στην
συνάρτηση SHA-1 το όνομα του αντικειμένου και μας επιστρέφεται ένα 16δικό hashcode
(objID), ίδιας μορφής με τα nodeID. Στη συνέχεια αποστέλουμε το objID μέσα στον
δαχτύλιο, και αναζητούμε τον κόμβο με το κοντινότερο αριθμητικά nodeID στο objID. Σε
αυτό τον κόμβο καταχωρείται ότι το αντικείμενο με αυτό το objID, μπορεί να το πάρει
κάποιος από τον κόμβο-αποστολέα του μηνύματος με το objID (καταχωρούνται δηλαδή,
μεταξύ άλλων, και η IP διεύθυνση και η port του αποστολέα).


Αναζήτηση Αντικειμένου

Η αναζήτηση αντικειμένου θυμίζει την εισαγωγή αντικειμένου. Αρχικά δίνουμε στην
συνάρτηση SHA-1 το όνομα του αντικειμένου προς αναζήτηση και μας επιστρέφεται ένα
16δικό hashcode (objID). Στη συνέχεια αποστέλουμε το objID μέσα στον δαχτύλιο, και ο
κόμβος με το κοντινότερο αριθμητικά nodeID στο objID, μας στέλνει ως απάντηση
πληροφορίες για τον κόμβο (μεταξύ άλλων, IP διεύθυνση και port) από τον οποίο
μπορούμε να πάρουμε το αντικείμενο που ψάχνουμε.


Classes

Node: Τάξη που αναπαριστά έναν κόμβο του δαχτυλίου Pastry. Μεταξύ άλλων θα περιέχει και την «κατάσταση» ενός κόμβου (state).

ShaID: Ταξη που αναπαριστά έναν κωδικό κατακερματισμού, αποτέλεσμα της συνάρτησης SHA-1 .

CheckJoin: Νήμα το οποίο ελέγχει για κάποιο μήνυμα “join” από κάποιον κόμβο που θέλει να εισέρθει στον δαχτύλιο.

CheckRequest: Νήμα το οποίο ελέγχει για κάποιο μήνυμα αναζήτησης αντικειμένου, πο έχει παραληπτη τον συγκεκριμένο κόμβο.

Pastry: Τάξη που περιέχει τις απαραίτητες μεθόδους για την λειτουργία του Pastry. Μεταξύ των μεθόδων της θα περιέχονται και οι μέθοδοι του Pastry API.


ΚΑΤΑ ΤΗΝ ΕΞΕΛΙΞΗ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΠΙΘΑΝΟΝ ΝΑ ΠΡΟΚΥΨΟΥΝ ΑΛΛΑΓΕΣ ΚΑΙ Η ΑΝΑΡΤΗΣΗ ΑΥΤΗ ΘΑ ΑΝΑΝΕΩΝΕΤΑΙ!

Monday, 13 December 2010

Δημιουργία Blog

Το blog του Muffin Pastry Project δημιουργήθηκε.

Ομάδα:  1) Νικόλαος Προμπονάς  ,  3070172
             2) Νικόλαος Σακιώτης     ,  3070153