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, ώστε να μπορούμε να τρέχουμε πολλούς κόμβους από τον ίδιο υπολογιστή.