update20140630
This commit is contained in:
BIN
Bundeswehr/musterung.pdf
Normal file
BIN
Bundeswehr/musterung.pdf
Normal file
Binary file not shown.
55
Bundeswehr/musterung.pdf.txt
Normal file
55
Bundeswehr/musterung.pdf.txt
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
|
||||||
|
|
||||||
|
Kreiswehrersatzamt Neuruppin
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Personenkennziffer
|
||||||
|
um: New -- 050187571637
|
||||||
|
Vorgangsnummer
|
||||||
|
|
||||||
|
Herrn 022-00970] h
|
||||||
|
|
||||||
|
Felix Axel Stubbe
|
||||||
|
Berliner Str. 131 B
|
||||||
|
16303 Schwedt/Oder Bearbeiter/in:FrauWi11e
|
||||||
|
|
||||||
|
i 03391/3569-330
|
||||||
|
|
||||||
|
Neuruppin, 27.1 1.2006
|
||||||
|
gegen Empfangsbekenntnis
|
||||||
|
|
||||||
|
Musterung
|
||||||
|
Sehr geehrter Herr Stubbe,
|
||||||
|
|
||||||
|
nach dem Ergebnis der Musterung am 27.11.2006 sind Sie nicht wehrdlenstffihlg. Eine Durchschrift des ärztlichen
|
||||||
|
Untersuchungsergebnisses/Verwendungsausweises ist beigefiigt.
|
||||||
|
|
||||||
|
Sie werden nicht zum Wehrdienst herangezogen.
|
||||||
|
Einer Entscheidung über Ihren Antrag auf Zurückstellung vorn 06.08.2004 bedarf es daher nicht.
|
||||||
|
Sie unterliegen nicht der Wehrüberwachung.
|
||||||
|
|
||||||
|
Angewandte Rechtsvorschriften: §§ Sa, 9, Z4 Abs.3 Wehrpflichtgesetz '
|
||||||
|
|
||||||
|
Rechtsbehelfsbelehrung
|
||||||
|
Gegen diesen Bescheid kann innerhalb von zwei Wochen nach Bekanntgabe Widerspruch erhoben werden. Der
|
||||||
|
|
||||||
|
Widerspruch ist beim Kreiswehrersatzamt Neuruppin, Eisenbahnen 23, 16816 Neuruppin schriftlich oder zur
|
||||||
|
Niederschrift einzulegen.
|
||||||
|
|
||||||
|
Mit freundlichen Grüßen
|
||||||
|
Im Auftrag
|
||||||
|
|
||||||
|
QMM
|
||||||
|
|
||||||
|
Wille
|
||||||
|
|
||||||
|
Das Schreiben enthält pensonenbezogene Daten (Schulzlzeietch 2 gem Dnnmhfixhmngsbeslilmnungen zu § 9 Bundesdatenschutzgesetz)
|
||||||
|
|
||||||
|
Auskunlts- und Eernmngszenlrum (A Hz): 03391/3569680 oder01s02/999640 ' 00011130 dc-
|
||||||
|
Sprecllzeilenz rommclmm Dienstgebäude: Telefon: 03391/35694)
|
||||||
|
Mo ‘Du < 07-30-I6-O0,Di—l8 oo Uhr Postfinch 1351 Eisenbnlmstr 23 Telefax: 03391/3559-343
|
||||||
|
Fr: 07:30-I330 Uhr 15802 Neumppm 16816 Neuruppin
|
||||||
|
|
||||||
|
und nach Vereinbarung! eMnll: KWEANeuruppin@bund=swehr.urg
|
||||||
|
|
||||||
BIN
Codewerk/Anschreiben Arbeitsvertrag Felix Stubbe.pdf
Normal file
BIN
Codewerk/Anschreiben Arbeitsvertrag Felix Stubbe.pdf
Normal file
Binary file not shown.
BIN
Codewerk/Arbeitsvertrag_Codewerk_Felix_Stubbe.pdf
Normal file
BIN
Codewerk/Arbeitsvertrag_Codewerk_Felix_Stubbe.pdf
Normal file
Binary file not shown.
BIN
Codewerk/personalfragebogen_codewerk.pdf
Normal file
BIN
Codewerk/personalfragebogen_codewerk.pdf
Normal file
Binary file not shown.
217
Codewerk/personalfragebogen_codewerk.pdf.txt
Normal file
217
Codewerk/personalfragebogen_codewerk.pdf.txt
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
Pe|‘S0n3lf|'a9eb09en für Sozialversicherungspflichtige
|
||||||
|
|
||||||
|
Persönliche Angaben Beschafugungen
|
||||||
|
|
||||||
|
Familienname S’ Fuk/‚w/
|
||||||
|
|
||||||
|
Vorname :4 ihr _
|
||||||
|
|
||||||
|
Straße und Hausnummer Ku */rr Ä“ 5/779
|
||||||
|
PLZ, Ort 46 75c ‘a, ’ 5214m fr
|
||||||
|
Geburtsdatum O5 Ü’. 74/ .477-
|
||||||
|
Sozialversicherungsnummer Q9 O 4J’ l S Q 7* k:
|
||||||
|
Geburtsname am M: i’
|
||||||
|
|
||||||
|
Geburtsort „Qglxvwtjfl-
|
||||||
|
|
||||||
|
Geburtsland D eu b0: l am, d’
|
||||||
|
Familienstand L 61%
|
||||||
|
|
||||||
|
Staatsangehörigkeit 02 q h; m I
|
||||||
|
Mitarbeitender Familienangehörige Elia Emein
|
||||||
|
Bankverbindung
|
||||||
|
|
||||||
|
Kontonummer
|
||||||
|
|
||||||
|
U iBAN 9:34 4 1-0 5 no 2 com; 36447
|
||||||
|
1:: BIC WfiLxfDfüfiu/Mtx
|
||||||
|
|
||||||
|
Bankleitzahl _
|
||||||
|
Bankbezeichnung 5fzM[/9197 IM-:7? 7:/,vw (‚In
|
||||||
|
Beschäftigung
|
||||||
|
|
||||||
|
Eintrittsdatum // f O i. Z 0 '70 g
|
||||||
|
Berufsbezeichnung Sc f/<4/a,~( em ht/I(I(’€ 7’
|
||||||
|
ausgeübte Tätigkeit
|
||||||
|
|
||||||
|
Arbeitgeber C0 '0/\" W C’ k g M"; M
|
||||||
|
erstellt du roh:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EHL-HUBER-W RTH Se-nelvofl
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Erfassungsbogen zum Tätigkeitsschlüssel
|
||||||
|
|
||||||
|
1 . Ausggübte Tätigkeit: Welche Tätigkeit übt der! die Beschäftigte im aktuellen
|
||||||
|
Beschäftigungsverhältnis aus?
|
||||||
|
Maßgebend ist alleine die derzeit ausgeübte Tätigkeit, NICHT der
|
||||||
|
erlernte Beruf.
|
||||||
|
|
||||||
|
&F*a/m at 1///a//(/5/ea
|
||||||
|
|
||||||
|
2, weichen allgemeinbildenden höchsten 3. Welchen höchsten ber fIi hen Ausbildun ahschluss
|
||||||
|
Schulggsghluss hat der! die Beschäftigte? hat deY/die Be5Ch3fTi9‘97
|
||||||
|
|
||||||
|
__ Ohne Beruflichen Ausbildungsabschluss (l)
|
||||||
|
Ohne Schulabschluss (1) Anerkannte Berufsausbildung (2)
|
||||||
|
Haupt-/Volksschulc (2) Meister/Techniker glelchw, Fachschulabschluss (3)
|
||||||
|
Mittlere Reife oder gleichwerüg (3) Bachelor (4)
|
||||||
|
|
||||||
|
Abitur/Fachabitur (4) K Diplom/Magister/Master/Staatsexamen (5)
|
||||||
|
Promotion/Habilitation (6)
|
||||||
|
4. ist der/die Beschäftige in einem 5. -landelt es sich um 5- |$N-13$ Beschäfiigungs‘
|
||||||
|
Zeitarbeitsverhältnis beschäftigt? eine Vollzeit- oder Verhältnis b__efristet oder
|
||||||
|
Teilzeitbeschäftigung? Unbefristet
|
||||||
|
T Ne1n(smmmpers0na1) i1 Vollzeit Befristet
|
||||||
|
Ia (Zeitarbeit) Teilzeit Unbefristet
|
||||||
|
Anmerkungen:
|
||||||
|
erstellt durch:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Seite 2 von 4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EHL- Husex- WARTH & AMANN
|
||||||
|
|
||||||
|
v.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Urlaubsanspruch
|
||||||
|
|
||||||
|
"770 in?!
|
||||||
|
|
||||||
|
(pro Kalenderjahr)
|
||||||
|
|
||||||
|
Wöchentliche Arbeitszeit
|
||||||
|
|
||||||
|
LrOÖ/um/ev/i
|
||||||
|
|
||||||
|
Beginn der Ausbildung
|
||||||
|
|
||||||
|
Voraussichtl. Ende der Ausbildung
|
||||||
|
|
||||||
|
Befristung:
|
||||||
|
Das Arbeitsverhältnis ist befristet
|
||||||
|
|
||||||
|
(Wenn ja, bitte schriftlichen Arbeitsvertrag in Kopie beifügen)
|
||||||
|
|
||||||
|
Sozialversicherung:
|
||||||
|
|
||||||
|
nein
|
||||||
|
|
||||||
|
Krankenkasse
|
||||||
|
|
||||||
|
E111/’/75/)’
|
||||||
|
|
||||||
|
-gesetzlich Krankenversichert
|
||||||
|
|
||||||
|
121a Ünein
|
||||||
|
|
||||||
|
—privat Krankenversichert
|
||||||
|
|
||||||
|
Eja Einein
|
||||||
|
|
||||||
|
Lohnsteuer:
|
||||||
|
|
||||||
|
Lohnsteuerklasse
|
||||||
|
|
||||||
|
/I
|
||||||
|
|
||||||
|
Kinderfreibetrag
|
||||||
|
|
||||||
|
Konfession
|
||||||
|
|
||||||
|
-__4
|
||||||
|
|
||||||
|
Steueridentifikations-Nr.
|
||||||
|
|
||||||
|
Vergütung:
|
||||||
|
|
||||||
|
904411 3 WM?
|
||||||
|
|
||||||
|
Stundenlohn
|
||||||
|
|
||||||
|
Ausbildungsvergütu ng
|
||||||
|
|
||||||
|
Gehalt
|
||||||
|
|
||||||
|
„Q O 00._'~4/)9 Mann/i‘
|
||||||
|
|
||||||
|
Zulagen
|
||||||
|
|
||||||
|
VL (Arbeitgeberzuschuss)
|
||||||
|
|
||||||
|
erstellt durch:
|
||||||
|
|
||||||
|
EHL - HUBER - WARTH a. AMANN
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Seite 3 von 4
|
||||||
|
|
||||||
|
Betriebliche
|
||||||
|
|
||||||
|
Altersvorsorge
|
||||||
|
ja
|
||||||
|
nein
|
||||||
|
|
||||||
|
Wenn ia, Art: Direktversicherung
|
||||||
|
|
||||||
|
Pensionskasse
|
||||||
|
Pensionsfond
|
||||||
|
Unlerstüizungskasse
|
||||||
|
Direktzusage
|
||||||
|
|
||||||
|
Beizulegen sind:
|
||||||
|
(soweit zutreffend)
|
||||||
|
|
||||||
|
Lohnsteuerkartel Bescheinigung für den Lohnsteuerabzug
|
||||||
|
(des laufenden Kalenderjahres)
|
||||||
|
|
||||||
|
Mitgliedsbescheinigng der Krankenkasse
|
||||||
|
|
||||||
|
Kopie des Sozialversicherungsausweises
|
||||||
|
|
||||||
|
Kopie des Arbeitsvertrages/ Ausbildungsvertrag
|
||||||
|
|
||||||
|
Kopie des Vertrages über die betriebliche Altersvorsorge
|
||||||
|
Kopie des VL-Vertrages
|
||||||
|
|
||||||
|
Nachweis der Elterneigenschaft (z.B. Geburtsurkunde etc.)
|
||||||
|
bei Studenten: lmmatrikulaüonsbescheinigung
|
||||||
|
|
||||||
|
bei Prakükanten: Praktikumsbescheinigung der Universität
|
||||||
|
Bescheinigung über den Schulbesuch
|
||||||
|
|
||||||
|
Auszug aus Prüfungs-l Studienordnung
|
||||||
|
|
||||||
|
Sonstiges
|
||||||
|
|
||||||
|
EIIIKE—
|
||||||
|
|
||||||
|
‚ Wir gmeg Sie ygi gag Iglgengm Umgrlyen neben 1g Bgnkvfllndung augh die IBAN und gig
|
||||||
|
|
||||||
|
Bl inzu ' hen:“ - Bankverbindung van „ VWL“
|
||||||
|
- Bankverbindung der „Betrieblichen Altersvorsorge“
|
||||||
|
- Bankverbindung bei „Pfändungen“
|
||||||
|
|
||||||
|
erstellt durch:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EHL - HUBER - WARTH s: AMANN
|
||||||
|
|
||||||
|
k i
|
||||||
|
|
||||||
|
Seite 4 von 4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
bons/20140610-Sonnemblumme_Sattlel_Glocke.pdf
Normal file
BIN
bons/20140610-Sonnemblumme_Sattlel_Glocke.pdf
Normal file
Binary file not shown.
39
bons/20140610-Sonnemblumme_Sattlel_Glocke.pdf.txt
Normal file
39
bons/20140610-Sonnemblumme_Sattlel_Glocke.pdf.txt
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
3G BIKES
|
||||||
|
|
||||||
|
the art of motion
|
||||||
|
|
||||||
|
3G Bikes Deutschland GmbH ~ Fliegerstr 1 — 30179 Hannover
|
||||||
|
|
||||||
|
Herrn
|
||||||
|
Felix Stubbe K‘?""k“
|
||||||
|
Rudolf-Breitscheid Straße 19 ;')":g:"5_I‘;-"1.
|
||||||
|
uver
|
||||||
|
16303 s°“""e‘“ Telefon: 0511 /357 35s 4s
|
||||||
|
Fax: 0511 I 357 35s 49
|
||||||
|
E-Mail: info@3gbikes.de
|
||||||
|
Datum: 10.06.2014
|
||||||
|
Recnnungs«Nr ' 20140263
|
||||||
|
Kunden-Nr.: 20637
|
||||||
|
7 _ 7 Sachbearbeiler/»in: P_|flpp Vogelbein
|
||||||
|
Rechnung
|
||||||
|
Sehr geehrter Herr Stubbe,
|
||||||
|
|
||||||
|
wir erlauben uns, wie folgt Rechnung zu stellen:
|
||||||
|
|
||||||
|
Pos. Anzahl Einheit Artikelnr. Bezeichnung Einzelpreis Gesamtpreis
|
||||||
|
|
||||||
|
‚ 1 1 Stk. 36267 Satteldecke "Sunflower", 250 X 230mm, Nylon, mit 10 3.90 € 3,90 €
|
||||||
|
|
||||||
|
mm Schaumeinlage
|
||||||
|
|
||||||
|
2 1 Stk. 23045 Klingel Maxi ding dong Sunflower 15,98 € 15,98 €
|
||||||
|
3 1 Stk. Versand 5,25 € 5,25 €
|
||||||
|
Gesamtbetrag 25,13 €
|
||||||
|
enthaltene Mehnuertsteuer 19% auf 21,12 € netto 4,01 €
|
||||||
|
Bremer Landesbank Geschäftsführer: Jürgen Blaskuwitz
|
||||||
|
Konto—Nr.: 303 22 77 O03 Handelsregister: HRB 205585
|
||||||
|
BLZ: 290 500 OO Amtsgericht Hannover
|
||||||
|
iBAN: DE 31 2905 0000 3032 2770 D3 Steuernummer: 25/209/15808
|
||||||
|
|
||||||
|
SWIFF: ERLADE22
|
||||||
|
|
||||||
BIN
bons/20140614-GaleriaKaufhaus.pdf
Normal file
BIN
bons/20140614-GaleriaKaufhaus.pdf
Normal file
Binary file not shown.
62
bons/20140614-GaleriaKaufhaus.pdf.txt
Normal file
62
bons/20140614-GaleriaKaufhaus.pdf.txt
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
|
||||||
|
|
||||||
|
(3£1hLER|A
|
||||||
|
|
||||||
|
A1exanderp1atz
|
||||||
|
A1exanderp1atz 9
|
||||||
|
10176 Ber11n
|
||||||
|
|
||||||
|
Te1.: 030-24743-0
|
||||||
|
Mustang, Bermuda 34 59,95
|
||||||
|
234 04042779614220
|
||||||
|
T Shirt 1/2 S.011v XL 9,95
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ii: I o t a 1
|
||||||
|
|
||||||
|
Anzah1 P05./Art. 2/2
|
||||||
|
EC—Cash EUR 69.90
|
||||||
|
~ Kundenbe1eg -
|
||||||
|
Kar1enzah1ung
|
||||||
|
girocard
|
||||||
|
Betrag: EUR 69,90
|
||||||
|
Datum: 14.06.14 Ze1t: 16:47
|
||||||
|
Term1na1-Nr: 67117171
|
||||||
|
Trace-Nr: 070083
|
||||||
|
Beleg: 2049
|
||||||
|
Karten-Nr: ###############14B0
|
||||||
|
Folge-Nr.: 0007
|
||||||
|
A10: 985674
|
||||||
|
Weitere Daten: 0000000000/EB00//
|
||||||
|
//440302//9012900002303000000000
|
||||||
|
00E80001
|
||||||
|
Zah1ung erfolgt
|
||||||
|
|
||||||
|
Uettowarenwert EUR 58,74
|
||||||
|
MwSt 19,00% EUR 11.15
|
||||||
|
Für diesen Einkauf hätten Sie mit der
|
||||||
|
PAVBACK Karte 10 Punkt(e) erha1ten1
|
||||||
|
(außer für Bücher
|
||||||
|
|
||||||
|
1111111111111 11|1I1|1111111111I111111111|11111111lI11
|
||||||
|
|
||||||
|
010/0210 14.06.14
|
||||||
|
Besuchen Sie unsere
|
||||||
|
Lego ~ SCHAU
|
||||||
|
in der 3.Eta9e
|
||||||
|
ha n für S1e geöffnet:
|
||||||
|
Mo — M1 9.30 — 20.00 Uhr
|
||||||
|
D0 Sa 9,30 - 22.00 Uhr
|
||||||
|
|
||||||
|
1tte den Kassenbon fur
|
||||||
|
Umtausch aufbewahrent
|
||||||
|
NEEE-Reg.-Nr. DEB0040693
|
||||||
|
|
||||||
|
UST-I0: DE 811142395
|
||||||
|
|
||||||
|
W1
|
||||||
|
|
||||||
|
m
|
||||||
|
|
||||||
BIN
bons/20140614-JackJones.pdf
Normal file
BIN
bons/20140614-JackJones.pdf
Normal file
Binary file not shown.
38
bons/20140614-JackJones.pdf.txt
Normal file
38
bons/20140614-JackJones.pdf.txt
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
J1-ICKE JONES‘
|
||||||
|
|
||||||
|
Vero Mada Jack E Jones
|
||||||
|
Bestseiier Retail Dtl. GmbH
|
||||||
|
Grunerstr. 20
|
||||||
|
10179 Berlin
|
||||||
|
Tei. 030 / 308744660
|
||||||
|
|
||||||
|
VERKAEUFER ohne Verkauf
|
||||||
|
|
||||||
|
5712063461593
|
||||||
|
ABSTRACT TEE S/S COR
|
||||||
|
5712410592055
|
||||||
|
CARSON TEE SS CREW N
|
||||||
|
PUSTEN
|
||||||
|
|
||||||
|
SUMME
|
||||||
|
|
||||||
|
girocard
|
||||||
|
|
||||||
|
MWST1
|
||||||
|
MWST Ü
|
||||||
|
|
||||||
|
2 .
|
||||||
|
6316 4479/001/001 14.06.2014 17:12 VA-00
|
||||||
|
\l1e1en Dank fur den Einkauf.
|
||||||
|
ao-Tege-Umtauschservi ce bundesweit. ab
|
||||||
|
Kaufdatum, gegen Vnriage des Kassenbons
|
||||||
|
oder des Umtauschetlketts und mit
|
||||||
|
Preisschild auf dem Artikei. Bei
|
||||||
|
Umtausch bitte den Kassenbon mitbringen.
|
||||||
|
Artikel können nur in der Originai-
|
||||||
|
Verpackung umgetauscht oder zurück-
|
||||||
|
gegeben warden, Bei Kundenrekiamarienen
|
||||||
|
bitte den Kassenbon mitbringen.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
bons/20140614-SOliver.pdf
Normal file
BIN
bons/20140614-SOliver.pdf
Normal file
Binary file not shown.
54
bons/20140614-SOliver.pdf.txt
Normal file
54
bons/20140614-SOliver.pdf.txt
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
3.901101
|
||||||
|
|
||||||
|
5.01 Iver Bernd Freier GmbH E Co. KG
|
||||||
|
Store 2059 Beriin Mexa
|
||||||
|
Grunerstraise 20 - 10179 Berlin
|
||||||
|
Te! . - 030-84712298-0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.: DE811253614
|
||||||
|
Berater: 99. 999
|
||||||
|
Art/EAN 4054872079004
|
||||||
|
Bermuda 49,99 1
|
||||||
|
Große G4 Farbe ‘SW8
|
||||||
|
|
||||||
|
Summe 49,99
|
||||||
|
Kartenzahiung EUR 49,99
|
||||||
|
|
||||||
|
s.0Hver Seriin Alexa
|
||||||
|
Gruruarstr. 20
|
||||||
|
10179 Ber] in
|
||||||
|
|
||||||
|
Kartenzahi ung
|
||||||
|
gi recard
|
||||||
|
Datum: 14.06.2014 Zeit: 17:21-46
|
||||||
|
Terminal -Nr. 1 54046040
|
||||||
|
Transaktv ons—Nr . z 129317
|
||||||
|
Beleg: 8490
|
||||||
|
Betrag: EUR 49,99
|
||||||
|
Kante-Nr. : mwmmummmnaao
|
||||||
|
KID: 810722
|
||||||
|
AID-Par ‚ : 0100000002
|
||||||
|
|
||||||
|
Zahlung erfoigt
|
||||||
|
|
||||||
|
Steuer mkiusiv: brutto MwSt netto
|
||||||
|
1 19,00 ‘X von 49,99 7,98 42,01
|
||||||
|
|
||||||
|
Datum Uhrzeit i-‘iiiai Pas Bed Transak
|
||||||
|
14‚06.14_17:22 12069 1 DePo
|
||||||
|
Vielen Dank ‘Fur Ihren Einkauf,
|
||||||
|
Umtausch innerhalb von 14 Tagen,
|
||||||
|
fur VIP Kunden 4 Wochen
|
||||||
|
nur mit Kassenbon und
|
||||||
|
Ware im Originalzustand.
|
||||||
|
|
||||||
|
l\|\\\\l\\\l\l\\|\ll|llll\lllllllllllllllllllllllllllllllllllfll
|
||||||
|
9000010000001 2 4
|
||||||
|
|
||||||
|
66000206 72014061417 1 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
kontoauszüge/40036805/Konto_40036805-Auszug_2014_001_pdf.pdf
Normal file
BIN
kontoauszüge/40036805/Konto_40036805-Auszug_2014_001_pdf.pdf
Normal file
Binary file not shown.
BIN
kontoauszüge/40036805/Konto_40036805-Auszug_2014_002_pdf.pdf
Normal file
BIN
kontoauszüge/40036805/Konto_40036805-Auszug_2014_002_pdf.pdf
Normal file
Binary file not shown.
BIN
kontoauszüge/45036148/Konto_45036148-Auszug_2014_002_pdf.pdf
Normal file
BIN
kontoauszüge/45036148/Konto_45036148-Auszug_2014_002_pdf.pdf
Normal file
Binary file not shown.
BIN
kontoauszüge/45036148/Konto_45036148-Auszug_2014_003_pdf.pdf
Normal file
BIN
kontoauszüge/45036148/Konto_45036148-Auszug_2014_003_pdf.pdf
Normal file
Binary file not shown.
BIN
perso/geburtsurkunde.pdf
Normal file
BIN
perso/geburtsurkunde.pdf
Normal file
Binary file not shown.
45
perso/geburtsurkunde.pdf.txt
Normal file
45
perso/geburtsurkunde.pdf.txt
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
DEUTSCHE DEMOKRATISCHE REPUBLIK
|
||||||
|
|
||||||
|
Geburtsurkunde
|
||||||
|
|
||||||
|
smdem,“ chwe d’: (Ode r)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"Fe lix____Ax.e 1 S tubbe männliche n Ge s chle chts u
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ist am
|
||||||
|
|
||||||
|
Schwe d1; (Ode
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
‚ geboren.
|
||||||
|
|
||||||
|
s1x¢m:....S_‘G<%.§. He
|
||||||
|
|
||||||
|
_Axe l Stubbe .
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Vermerke: keine -
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
?W@W—lE4 017 ä’ L1 ~13
|
||||||
|
|
||||||
|
lcneil-NLJOOIO VVSptemberg (37/11) mos A3310/87/DDRI615
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
uni/Bestätigung über Abschluss.pdf
Normal file
BIN
uni/Bestätigung über Abschluss.pdf
Normal file
Binary file not shown.
0
uni/masterarbeit/masterarbeit.txt
Normal file
0
uni/masterarbeit/masterarbeit.txt
Normal file
BIN
uni/masterarbeit/masterplan.pdf
Normal file
BIN
uni/masterarbeit/masterplan.pdf
Normal file
Binary file not shown.
64
uni/masterarbeit/masterplan.pdf.txt
Normal file
64
uni/masterarbeit/masterplan.pdf.txt
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
m=_...8...m= E. §mm8_.-mn=&:E SSH
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Genua? „.2. MN N N Q \\
|
||||||
|
|
||||||
|
\§\n
|
||||||
|
|
||||||
|
%.N\l.
|
||||||
|
|
||||||
|
mEn_¢=S=
|
||||||
|
|
||||||
|
§m=S_.>=
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
x.
|
||||||
|
|
||||||
|
<9m:Nm=n_m>. mam w:._E=mmm:mmn::$mm
|
||||||
|
|
||||||
|
Emäar 32.8!
|
||||||
|
fiat... T...» „i6: N Pam. m. $.:..m
|
||||||
|
H. mmBmm8n N mmammnmn w. mmammaw Kr mmEmm8., Eu
|
||||||
|
~A==.u_mx =<E..<E.z...»==n
|
||||||
|
zaroafia O_.==n=mmm= . mama» E5 mwmääm 53m
|
||||||
|
. Onzunmmmmn „.2
|
||||||
|
:o„...„2.=2.:2..=..„
|
||||||
|
<m..:m„...:mw...n::.:m„ . z„„.._..„._;=....„2„amsa . E9955: moan
|
||||||
|
%o==.=:.E.wm:.o=m. Ea zwang. . wzxm ... ‚
|
||||||
|
.Hmn_..=o_o ä... . ..._..o..a=<„ Z£N~mnr=o_am.m
|
||||||
|
m . 23%
|
||||||
|
_€aaE=s:o=mmsaH
|
||||||
|
>33 .E_m:_m:_8.=Emxm ‚ N..<2.mm.w.a= E... ‚manifim . monsam Etwa
|
||||||
|
_..mEm:o_2m=u. . . 9.3.? m: mämmcmzmß
|
||||||
|
. may . _=$m_..m:m Efimzis mfiaam
|
||||||
|
$52.: . 5335...... mazes.
|
||||||
|
mmn_=..__.~.,m25..=%u mE.=E= . waoamrnswammmfimun ma
|
||||||
|
.=„.=„n.„.„ä.„m.:.5 F. imam: mmfimflmu Po N
|
||||||
|
mmEmE
|
||||||
|
„An-Ein... :<_H.m=mäw=mmmn=:n
|
||||||
|
mmEEE. 2.2 Eaéea mozmmmnrlnmsmu. E.o_.m_:mm=:=m_. ma
|
||||||
|
Emraaa E/:Am Zmfiimaamfliwmou
|
||||||
|
mmnaumn 2.2 m_.mrEE:_
|
||||||
|
_Swm»m_.m_.um: 2%.. mo
|
||||||
|
:.E:mEm Bw:._EE
|
||||||
|
|
||||||
BIN
uni/masterarbeit/masterprüfung.pdf
Normal file
BIN
uni/masterarbeit/masterprüfung.pdf
Normal file
Binary file not shown.
74
uni/masterarbeit/masterprüfung.pdf.txt
Normal file
74
uni/masterarbeit/masterprüfung.pdf.txt
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
Brandenburglsche
|
||||||
|
. . . .. Verteuerz Bl 1 (wen's) zururk zum Prüfungsamt
|
||||||
|
Technische Umversltat aw 2 (gelb) verhlexbl bexm mm
|
||||||
|
Bl 3 (pm) vermelbt beim Prüfungsamt
|
||||||
|
COttbU S 5| 4 (blau) fur den Studenten
|
||||||
|
|
||||||
|
Studiengang:
|
||||||
|
PRÜ FUNGSMELDUNG Name Vumame
|
||||||
|
|
||||||
|
zur
|
||||||
|
Ü DipIom-Vorprüfung/Bachelor
|
||||||
|
Anschnfl {in Zustellung des Bescheides hex endgflmg mchtbeslandener Prüfung
|
||||||
|
|
||||||
|
Ü Diplomprüfung/Master
|
||||||
|
|
||||||
|
Ü Diplom/BacheIor/Masterarbeit 79%": Ma‘r~NV- \ ‘
|
||||||
|
Erste Frewersuch zur Erste Zweite Prüfungsordnung
|
||||||
|
Prüfung Notenverbesserung Wiederhclungsprüfung Wredemolungspruiung vom
|
||||||
|
|
||||||
|
Für den Prüfungszeitraum
|
||||||
|
|
||||||
|
Fach
|
||||||
|
|
||||||
|
Prüfer/Betreuer
|
||||||
|
|
||||||
|
Je, Memung enlgegengenummen am: ‚
|
||||||
|
Datum / Unterschrift des Sludenlen l der Studenhn Die Pruvungsvorausseczungen sind erfüllt.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Prüfungsergebnis
|
||||||
|
|
||||||
|
Pmlnkol! Uberdxe mündhchaschrwlfliche Prilfung/Verteldxgung der Dimom/Bachelor/Masterarbeu (Gegensmnde, Vsrlaul, Ergebmsse ‘m Stichworten)
|
||||||
|
|
||||||
|
Damm: e Eegmn: e Uhr Ende. e Uhr Ausgabe des Themas:
|
||||||
|
Datum
|
||||||
|
|
||||||
|
Thema der Arbem- Abgabe der Arbeit:
|
||||||
|
|
||||||
|
Datum
|
||||||
|
|
||||||
|
engl. Uberselzung:
|
||||||
|
|
||||||
|
(bei Erlurdsrms Ruckseue verwenden)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
‚ Dipbm/BacheIor/Masterarbeit
|
||||||
|
Note.
|
||||||
|
Note: 1 Gutachten
|
||||||
|
Note. 2. Gutachten ’
|
||||||
|
y Pmler/Gulacmer:
|
||||||
|
Elnzemolen Lie: Verleldlgung > umerscnrxwnaxum
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
w 1,3 sehrgul „ ‚ x , ‚’ y. '
|
||||||
|
|
||||||
|
„ 2., 23 w. Gesamnnwe Pmfe"Gma°h*er" -' r e. .
|
||||||
|
‘ ' ' u z h HID m
|
||||||
|
|
||||||
|
2,7 s,u 3,3 hemedwgend "am " a m
|
||||||
|
|
||||||
|
3J 49 ausrencherm Bg|§“Ze[_
|
||||||
|
5.0 mchl ausreichend 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Unlerschrm/Da|um
|
||||||
|
|
||||||
|
Vmsnzenuer des Prfliurvgsausschusseslflalum
|
||||||
|
|
||||||
|
_„
|
||||||
|
|
||||||
341
uni/masterarbeit/source/moversight/BaseMoversight.cc
Normal file
341
uni/masterarbeit/source/moversight/BaseMoversight.cc
Normal file
@@ -0,0 +1,341 @@
|
|||||||
|
#include "BaseMoversight.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*/
|
||||||
|
BaseMoversight::BaseMoversight() : printDebugAC(true), printDebugUC(true), printDebugDIS(true), printDebugNFD(true), printDebugMT(true), printDebugMS(true), printDebugTC(true), printDebugAPP(true), printDebugMOB(true), printDebugST(true), printDebugCT(true), printDebugUT(true), printDebugVISU(true), printDebugES(true), enableNFD(true), enableRecordStats(true) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
BaseMoversight::~BaseMoversight() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the printing debug information within the dispatcher is enabled, or not.
|
||||||
|
* @return True, if the printing is enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugDIS() {
|
||||||
|
return printDebugDIS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the printing of the debug information within the dispatcher.
|
||||||
|
* @param value True, to enable the printing, false to disable the printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugDIS(bool value) {
|
||||||
|
printDebugDIS = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the printing debug information within the NFD enabled, or not.
|
||||||
|
* @return True, if the printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugNFD() {
|
||||||
|
return printDebugNFD;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the printing of the debug information within the NFD.
|
||||||
|
* @param value True, to enable the printing, false to disable the printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugNFD(bool value) {
|
||||||
|
printDebugNFD = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the printing debug information within the MT enabled, or not.
|
||||||
|
* @return True, if the printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugMT() {
|
||||||
|
return printDebugMT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the printing of the debug information within the MT.
|
||||||
|
* @param value True, to enable the printing, false to disable the printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugMT(bool value) {
|
||||||
|
printDebugMT = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the printing debug information within the MS enabled, or not.
|
||||||
|
* @return True, if the printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugMS() {
|
||||||
|
return printDebugMS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the printing of the debug information within the MS.
|
||||||
|
* @param value True, to enable the printing, false to disable the printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugMS(bool value) {
|
||||||
|
printDebugMS = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the printing debug information within the TC enabled, or not.
|
||||||
|
* @return True, if the printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugTC() {
|
||||||
|
return printDebugTC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the printing of the debug information within the TC.
|
||||||
|
* @param value True, to enable the printing, false to disable the printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugTC(bool value) {
|
||||||
|
printDebugTC = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the printing debug information within the MOB enabled, or not.
|
||||||
|
* @return True, if the printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugMOB() {
|
||||||
|
return printDebugMOB;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the printing of the debug information within the MOB.
|
||||||
|
* @param value True, to enable the printing, false to disable the printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugMOB(bool value) {
|
||||||
|
printDebugMOB = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the printing debug information within the ST enabled, or not.
|
||||||
|
* @return True, if the printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugST() {
|
||||||
|
return printDebugST;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the printing of the debug information within the ST.
|
||||||
|
* @param value True, to enable the printing, false to disable the printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugST(bool value) {
|
||||||
|
printDebugST = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the printing debug information within the CT enabled, or not.
|
||||||
|
* @return True, if the printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugCT() {
|
||||||
|
return printDebugCT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the printing of the debug information within the CT.
|
||||||
|
* @param value True, to enable the printing, false to disable the printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugCT(bool value) {
|
||||||
|
printDebugCT = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the printing debug information within the UT enabled, or not.
|
||||||
|
* @return True, if the printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugUT() {
|
||||||
|
return printDebugUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the printing of the debug information within the UT.
|
||||||
|
* @param value True, to enable the printing, false to disable the printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugUT(bool value) {
|
||||||
|
printDebugUT = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the printing debug information within the APP enabled, or not.
|
||||||
|
* @return True, if the printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugAPP() {
|
||||||
|
return printDebugAPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the printing of the debug information within the APP.
|
||||||
|
* @param value True, to enable the printing, false to disable the printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugAPP(bool value) {
|
||||||
|
printDebugAPP = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if printing debug information within the visualization module is enabled, or not.
|
||||||
|
* @return True, if printing is enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugVISU() {
|
||||||
|
return printDebugVISU;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables printing of debug information within the visualization module.
|
||||||
|
* @param value True, to enable printing, false to disable printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugVISU(bool value) {
|
||||||
|
printDebugVISU = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if printing debug information within the event system is enabled, or not.
|
||||||
|
* @return True, if printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugES() {
|
||||||
|
return printDebugES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables printing of debug information within the event system.
|
||||||
|
* @param value True, to enable printing, false to disable printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugES(bool value) {
|
||||||
|
printDebugES = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if printing debug information within the UbeemeConnector is enabled, or not.
|
||||||
|
* @return True, if printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugUC() {
|
||||||
|
return printDebugUC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables printing of debug information within the UbeemeConnector.
|
||||||
|
* @param value True, to enable printing, false to disable printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugUC( bool value) {
|
||||||
|
printDebugUC = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if printing debug information within the ApplicationConnector is enabled, or not.
|
||||||
|
* @return True, if printing enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isPrintDebugAC() {
|
||||||
|
return printDebugAC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables printing of debug information within the ApplicationConnector.
|
||||||
|
* @param value True, to enable printing, false to disable printing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setPrintDebugAC( bool value) {
|
||||||
|
printDebugAC = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the NFD enabled, or not.
|
||||||
|
* @return True, if the NFD enabled, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isNFDEnabled() {
|
||||||
|
return enableNFD;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the NFD.
|
||||||
|
* @param value True to enable, false to disable the service.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setNFDEnabled(bool value) {
|
||||||
|
enableNFD = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Determines, if the statistic recording is enabled.
|
||||||
|
* @return True, if the recording enabled, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
BaseMoversight::isRecordStats() const {
|
||||||
|
return enableRecordStats;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables or disables the statistic recording.
|
||||||
|
* @param enableRecordStats True for enable, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
BaseMoversight::setRecordStats(bool enableRecordStats) {
|
||||||
|
|
||||||
|
this->enableRecordStats = enableRecordStats;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assignment operator.
|
||||||
|
* @param other The instance to assign.
|
||||||
|
* @return A reference of the current object.
|
||||||
|
*/
|
||||||
|
BaseMoversight & BaseMoversight::operator =(BaseMoversight const & other) {
|
||||||
|
|
||||||
|
if (this == &other) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
printDebugAC = other.printDebugAC;
|
||||||
|
printDebugUC = other.printDebugUC;
|
||||||
|
printDebugDIS = other.printDebugDIS;
|
||||||
|
printDebugNFD = other.printDebugNFD;
|
||||||
|
printDebugMT = other.printDebugMT;
|
||||||
|
printDebugMS = other.printDebugMS;
|
||||||
|
printDebugTC = other.printDebugTC;
|
||||||
|
printDebugAPP = other.printDebugAPP;
|
||||||
|
printDebugMOB = other.printDebugMOB;
|
||||||
|
printDebugST = other.printDebugST;
|
||||||
|
printDebugCT = other.printDebugCT;
|
||||||
|
printDebugUT = other.printDebugUT;
|
||||||
|
printDebugVISU = other.printDebugVISU;
|
||||||
|
printDebugES = other.printDebugES;
|
||||||
|
|
||||||
|
enableNFD = other.enableNFD;
|
||||||
|
enableRecordStats = other.enableRecordStats;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
109
uni/masterarbeit/source/moversight/BaseMoversight.h
Normal file
109
uni/masterarbeit/source/moversight/BaseMoversight.h
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef BASEMOVERSIGHT_H
|
||||||
|
#define BASEMOVERSIGHT_H
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "app/PeerDescription.h"
|
||||||
|
|
||||||
|
#if UBEEME
|
||||||
|
#include "core/network/network_message.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup Moversight Moversight
|
||||||
|
* @brief Defines the base interface for the Moversight protocol.
|
||||||
|
* @class BaseMoversight
|
||||||
|
* @author Jan Gäbler
|
||||||
|
*
|
||||||
|
* The Moversight group communication protocol.
|
||||||
|
*/
|
||||||
|
class BaseMoversight {
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual TransportAddress & getLocalAddress() = 0;
|
||||||
|
|
||||||
|
bool isPrintDebugDIS();
|
||||||
|
void setPrintDebugDIS(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugNFD();
|
||||||
|
void setPrintDebugNFD(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugMT();
|
||||||
|
void setPrintDebugMT(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugMS();
|
||||||
|
void setPrintDebugMS(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugTC();
|
||||||
|
void setPrintDebugTC(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugST();
|
||||||
|
void setPrintDebugST(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugMOB();
|
||||||
|
void setPrintDebugMOB(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugCT();
|
||||||
|
void setPrintDebugCT(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugUT();
|
||||||
|
void setPrintDebugUT(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugAPP();
|
||||||
|
void setPrintDebugAPP(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugVISU();
|
||||||
|
void setPrintDebugVISU(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugES();
|
||||||
|
void setPrintDebugES(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugUC();
|
||||||
|
void setPrintDebugUC(bool value);
|
||||||
|
|
||||||
|
bool isPrintDebugAC();
|
||||||
|
void setPrintDebugAC(bool value);
|
||||||
|
|
||||||
|
bool isNFDEnabled();
|
||||||
|
void setNFDEnabled(bool value);
|
||||||
|
|
||||||
|
bool isRecordStats() const;
|
||||||
|
void setRecordStats(bool enableRecordStats);
|
||||||
|
|
||||||
|
BaseMoversight & operator =(BaseMoversight const & other);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
BaseMoversight();
|
||||||
|
virtual ~BaseMoversight();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
bool printDebugAC;
|
||||||
|
bool printDebugUC;
|
||||||
|
bool printDebugDIS;
|
||||||
|
bool printDebugNFD;
|
||||||
|
bool printDebugMT;
|
||||||
|
bool printDebugMS;
|
||||||
|
bool printDebugTC;
|
||||||
|
bool printDebugAPP;
|
||||||
|
bool printDebugMOB;
|
||||||
|
bool printDebugST;
|
||||||
|
bool printDebugCT;
|
||||||
|
bool printDebugUT;
|
||||||
|
bool printDebugVISU;
|
||||||
|
bool printDebugES;
|
||||||
|
|
||||||
|
bool enableNFD;
|
||||||
|
bool enableRecordStats;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // BASEMOVERSIGHT_H
|
||||||
1041
uni/masterarbeit/source/moversight/Dispatcher.cc
Normal file
1041
uni/masterarbeit/source/moversight/Dispatcher.cc
Normal file
File diff suppressed because it is too large
Load Diff
272
uni/masterarbeit/source/moversight/Dispatcher.h
Normal file
272
uni/masterarbeit/source/moversight/Dispatcher.h
Normal file
@@ -0,0 +1,272 @@
|
|||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
|
// along with this program. If not, see http://www.gnu.org/licenses/.
|
||||||
|
//
|
||||||
|
/*
|
||||||
|
* File: Dispatcher.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on September 20, 2010, 1:30 PM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef DISPATCHER_H
|
||||||
|
#define DISPATCHER_H
|
||||||
|
|
||||||
|
#include "ct/CausalTransfer.h"
|
||||||
|
#include "common/UbeemeConnector.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "common/transport/MoversightMessageQueue.h"
|
||||||
|
#include "common/validator/MessageValidatorType.h"
|
||||||
|
#include "event/EventService.h"
|
||||||
|
#include "event/ObjectListener.h"
|
||||||
|
#include "merge/MergeService.h"
|
||||||
|
#include "mob/MobilitySupport.h"
|
||||||
|
#include "mrs/MaintanceRoleService.h"
|
||||||
|
#include "mrs/metric/MaintanceMomentMetricTypes.h"
|
||||||
|
#include "mrs/sync/NextViewBuffer.h"
|
||||||
|
#include "ms/placingstrategy/PeerPlacingStrategyType.h"
|
||||||
|
#include "ms/MembershipService.h"
|
||||||
|
#include "ms/Invitation.h"
|
||||||
|
#include "mt/MessageTransfer.h"
|
||||||
|
#include "fd/FailureDetector.h"
|
||||||
|
#include "rvd/ResourceValueDistributor.h"
|
||||||
|
#include "simutils/logger/MemberRegisterLogger.h"
|
||||||
|
#include "split/SplitService.h"
|
||||||
|
#include "st/StreamTransfer.h"
|
||||||
|
#include "ts/TimeService.h"
|
||||||
|
#include "ut/UnicastTransfer.h"
|
||||||
|
|
||||||
|
#if UBEEME
|
||||||
|
#include "core/event/event_container.h"
|
||||||
|
#include "core/event/event_sender.h"
|
||||||
|
|
||||||
|
class GroupMessage;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MessageValidator;
|
||||||
|
class Moversight;
|
||||||
|
class Application;
|
||||||
|
class Peer;
|
||||||
|
class PeerResources;
|
||||||
|
class Roster;
|
||||||
|
class NetworkFailureDetector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Implements the dispatcher of the Moversight protocol.
|
||||||
|
* @class Dispatcher
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @author Jan Gäbler, Robert Noack
|
||||||
|
*/
|
||||||
|
#if OMNETPP
|
||||||
|
class Dispatcher : public ObjectListener {
|
||||||
|
#else
|
||||||
|
|
||||||
|
class Dispatcher : public EventSender {
|
||||||
|
#endif
|
||||||
|
public:
|
||||||
|
|
||||||
|
Dispatcher(Moversight & aModule, Application & app);
|
||||||
|
virtual ~Dispatcher();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void handleMessage(MoversightMessage *msg);
|
||||||
|
void handleSavedMessages();
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// API Methods
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
void sendMessage(MulticastMessage& msg); // @NOTE used by several services.
|
||||||
|
void sendMessage(StreamMessage& msg);
|
||||||
|
|
||||||
|
void invitePeer(TransportAddress & ta, PeerDescription & pDesc);
|
||||||
|
void cancelInvitation(TransportAddress & ta, std::string reason);
|
||||||
|
|
||||||
|
void acceptInvitation(const Invitation & inv, const std::string & comment, const PeerDescription & pDesc, const PeerResources & resource);
|
||||||
|
void rejectInvitation(const Invitation & inv, const std::string & reason);
|
||||||
|
|
||||||
|
void leaveGroup();
|
||||||
|
|
||||||
|
void splitGroup(unsigned char options, PeerIDList splitPeers);
|
||||||
|
void mergeGroup(TransportAddress & destTa);
|
||||||
|
void acceptGroupMerge();
|
||||||
|
void rejectGroupMerge(std::string & reason);
|
||||||
|
|
||||||
|
Peer & getLocalPeer();
|
||||||
|
TransportAddress getLocalAddressFromPeer(PeerID pId);
|
||||||
|
const State & getLocalState() const;
|
||||||
|
const SubState & getLocalSubState() const;
|
||||||
|
const StateOperation & getLocalStateOperation() const;
|
||||||
|
|
||||||
|
void setLocalPeerResources(const PeerResources & pres);
|
||||||
|
const PeerResources & getLocalPeerResources() const;
|
||||||
|
|
||||||
|
ViewID getViewID() const;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
// Object Delivery System
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
template<typename ObjType>
|
||||||
|
void subscribe(ObjectListener * ol);
|
||||||
|
template<typename ObjType>
|
||||||
|
void unsubscribe(ObjectListener * ol);
|
||||||
|
void unsubscribeAll(ObjectListener * ol);
|
||||||
|
|
||||||
|
void signal(DeliverableObject* e, ObjectListener* recipient = NULL);
|
||||||
|
|
||||||
|
// Event Handling
|
||||||
|
void handleEvent(const GroupClosedEvent & e);
|
||||||
|
void handleEvent(const FlushDoneEvent & e);
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
// Event signals from other Ubeeme components
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
void signalConnectionLost();
|
||||||
|
void signalConnectionReEstablished();
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
|
||||||
|
Application & getMoversightCallback();
|
||||||
|
const Application & getMoversightCallback() const;
|
||||||
|
|
||||||
|
Moversight & getMoversight();
|
||||||
|
const Moversight & getMoversight() const;
|
||||||
|
|
||||||
|
MembershipService & getMembershipService();
|
||||||
|
const MembershipService & getMembershipService() const;
|
||||||
|
|
||||||
|
EventService & getEventService();
|
||||||
|
const EventService & getEventService() const;
|
||||||
|
|
||||||
|
FailureDetector & getFailureDetector();
|
||||||
|
const FailureDetector & getFailureDetector() const;
|
||||||
|
|
||||||
|
NetworkFailureDetector & getNetworkFailureDetector();
|
||||||
|
const NetworkFailureDetector & getNetworkFailureDetector() const;
|
||||||
|
|
||||||
|
MobilitySupport & getMobilitySupport();
|
||||||
|
const MobilitySupport & getMobilitySupport() const;
|
||||||
|
|
||||||
|
TimeService & getTimeService();
|
||||||
|
const TimeService & getTimeService() const;
|
||||||
|
|
||||||
|
MergeService & getMergeService();
|
||||||
|
const MergeService & getMergeService() const;
|
||||||
|
|
||||||
|
SplitService & getSplitService();
|
||||||
|
const SplitService & getSplitService() const;
|
||||||
|
|
||||||
|
CausalTransfer & getCausalTransfer();
|
||||||
|
const CausalTransfer & getCausalTransfer() const;
|
||||||
|
|
||||||
|
StreamTransfer & getStreamTransfer();
|
||||||
|
const StreamTransfer & getStreamTransfer() const;
|
||||||
|
|
||||||
|
UnicastTransfer & getUnicastTransfer();
|
||||||
|
const UnicastTransfer & getUnicastTransfer() const;
|
||||||
|
|
||||||
|
MessageTransfer & getMessageTransfer();
|
||||||
|
const MessageTransfer & getMessageTransfer() const;
|
||||||
|
|
||||||
|
MaintenanceRoleService & getMaintenanceRoleService();
|
||||||
|
const MaintenanceRoleService & getMaintenanceRoleService() const;
|
||||||
|
|
||||||
|
ResourceValueDistributor & getResourceValueDistributor();
|
||||||
|
const ResourceValueDistributor & getResourceValueDistributor() const;
|
||||||
|
|
||||||
|
NextViewBuffer & getNextViewBuffer();
|
||||||
|
const NextViewBuffer & getNextViewBuffer() const;
|
||||||
|
|
||||||
|
size_t getGroupSize() const;
|
||||||
|
const PeerPlacingStrategyType & getPeerPlacingStrategyType() const;
|
||||||
|
|
||||||
|
const PeerPlacingStrategyMetricType & getPeerPlacingStrategyMetricType() const;
|
||||||
|
|
||||||
|
const MaintanceMomentMetricType & getMaintanceMomentMetricType() const;
|
||||||
|
|
||||||
|
void setStandardMessageValidator();
|
||||||
|
void setMessageValidator(MessageValidatorType type);
|
||||||
|
const MessageValidator * getMessageValidator() const;
|
||||||
|
|
||||||
|
void setupGroupFromRoster(Roster & roster, PeerID localPeerID);
|
||||||
|
|
||||||
|
Dispatcher & operator = (Dispatcher const & other);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
Application & app;
|
||||||
|
|
||||||
|
Moversight & module;
|
||||||
|
|
||||||
|
MembershipService ms;
|
||||||
|
EventService es;
|
||||||
|
CausalTransfer ct;
|
||||||
|
StreamTransfer st;
|
||||||
|
UnicastTransfer ut;
|
||||||
|
MessageTransfer mt;
|
||||||
|
FailureDetector fd;
|
||||||
|
MobilitySupport mob;
|
||||||
|
MergeService merge;
|
||||||
|
SplitService split;
|
||||||
|
TimeService ts;
|
||||||
|
MaintenanceRoleService mrs;
|
||||||
|
ResourceValueDistributor rvd;
|
||||||
|
NextViewBuffer nvb;
|
||||||
|
|
||||||
|
UbeemeConnector uc;
|
||||||
|
|
||||||
|
MessageValidator * messageValidator;
|
||||||
|
// MoversightMessageQueue tempMessageQueue;
|
||||||
|
MemberRegisterLogger logMemberRegister;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Subscribe for a certain type of object.
|
||||||
|
*
|
||||||
|
* This will add <ObjType> as a key value to <subscriptions>, if not
|
||||||
|
* already present. <ms> will be inserted in the object's subscriber list.
|
||||||
|
* To subscribe to multiple objects, you have to call <subscribe()>
|
||||||
|
* subsequently.
|
||||||
|
*
|
||||||
|
* @tparam ObjType Type of object to subscribe to.
|
||||||
|
* @param ms The Moversight service which is subscribing to the object.
|
||||||
|
*/
|
||||||
|
template<typename ObjType>
|
||||||
|
void
|
||||||
|
Dispatcher::subscribe(ObjectListener * ol) {
|
||||||
|
es.subscribe(ol, typeid(ObjType*).name());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Unsubscribe from a certain type of object.
|
||||||
|
*
|
||||||
|
* The service will be removed from the object's list of subscribers.
|
||||||
|
* To unsubscribe from multiple objects you have to use subsequent calls
|
||||||
|
* to <unsubscribe()>.
|
||||||
|
*
|
||||||
|
* @tparam ObjType Type of object to unsubscribe from.
|
||||||
|
* @param ms The Moversight service to unsubscribe.
|
||||||
|
*/
|
||||||
|
template<typename ObjType>
|
||||||
|
void
|
||||||
|
Dispatcher::unsubscribe(ObjectListener * ol) {
|
||||||
|
es.unsubscribe(ol, typeid(ObjType*).name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* DISPATCHER_H */
|
||||||
52961
uni/masterarbeit/source/moversight/Makefile
Normal file
52961
uni/masterarbeit/source/moversight/Makefile
Normal file
File diff suppressed because it is too large
Load Diff
766
uni/masterarbeit/source/moversight/Moversight.cc
Normal file
766
uni/masterarbeit/source/moversight/Moversight.cc
Normal file
@@ -0,0 +1,766 @@
|
|||||||
|
/*
|
||||||
|
* File: Moversight.cc
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on September 20, 2010, 1:30 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Moversight.h"
|
||||||
|
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
#include "common/transport/MoversightMessageTypes.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "common/transport/msg/ExteriorMessage.h"
|
||||||
|
#include "common/validator/MessageValidator.h"
|
||||||
|
#include "ms/Peer.h"
|
||||||
|
#include "ms/msg/MSMessageFactory.h"
|
||||||
|
#include "mt/timer/MTTimer.h"
|
||||||
|
#include "mt/msg/MulticastMessage.h"
|
||||||
|
#include "fd/NetworkFailureDetectorType.h"
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
|
||||||
|
#include "app/Application.h"
|
||||||
|
#include "app/ApplicationLevelMulticastTestApplication.h"
|
||||||
|
#include "app/MergeApplication.h"
|
||||||
|
#include "app/PeerplacingApplication.h"
|
||||||
|
#include "app/SplitApplication.h"
|
||||||
|
#include "app/TestApplication.h"
|
||||||
|
#include "app/PartitionApplication.h"
|
||||||
|
#include "app/PendingTestApplication.h"
|
||||||
|
#include "app/MaintanceApplication.h"
|
||||||
|
|
||||||
|
//omnet address related stuff
|
||||||
|
#include "IPvXAddressResolver.h"
|
||||||
|
#include "UDPControlInfo.h"
|
||||||
|
#include "InterfaceEntry.h"
|
||||||
|
#include "IInterfaceTable.h"
|
||||||
|
#include "IPvXAddress.h"
|
||||||
|
#include "IPv4InterfaceData.h"
|
||||||
|
#include "mobility/models/MovingMobilityBase.h"
|
||||||
|
#include "mobility/models/StationaryMobility.h"
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
|
||||||
|
#define simulationTriggerTimeout 10
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Declares Moversight as omnetpp module.
|
||||||
|
*/
|
||||||
|
Define_Module(Moversight);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
Moversight::Moversight(MoversightCallback & callBack) : UDPNodeEventReceiver(0, false), infoObject(NULL), dispatcher(*this, callBack) {
|
||||||
|
#if 0
|
||||||
|
bool printDebugDIS;
|
||||||
|
bool printDebugNFD;
|
||||||
|
bool printDebugMT;
|
||||||
|
bool printDebugMS;
|
||||||
|
bool printDebugTC;
|
||||||
|
bool printDebugST;
|
||||||
|
bool printDebugCT;
|
||||||
|
bool printDebugAPP;
|
||||||
|
|
||||||
|
bool enableNFD;
|
||||||
|
bool enableMobilitySupport = default(true);
|
||||||
|
bool enableNetworkFailureDetector = default(true);
|
||||||
|
bool enableStreamTransfer = default(true);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
setNFDEnabled(false);
|
||||||
|
initialize(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Moversight::~Moversight() {
|
||||||
|
}//End
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the local address.
|
||||||
|
* @return The local address.
|
||||||
|
*/
|
||||||
|
|
||||||
|
TransportAddress &
|
||||||
|
Moversight::getLocalAddress() {
|
||||||
|
#if UBEEME
|
||||||
|
bool success = false;
|
||||||
|
if (infoObject.isNull()) {
|
||||||
|
success = initNetworkInfos();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
PhysicalNetworkInterface::AddressEntryList addressList = infoObject->addressList;
|
||||||
|
PhysicalNetworkInterface::AddressEntryList::iterator it = addressList.begin();
|
||||||
|
if (it != addressList.end()) {
|
||||||
|
if (it->ip().protocol() == QAbstractSocket::IPv4Protocol) {
|
||||||
|
MOV_DEBUG << "Local: " << it->ip().toString();
|
||||||
|
localTA = TransportAddress(it->ip(), infoObject->boundPort);
|
||||||
|
}
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
localTA = TransportAddress();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return localTA;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the local transport address of the current host
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::setLocalAddress() {
|
||||||
|
|
||||||
|
cModule *mod = getParentModule(); // get the MoversightPeer
|
||||||
|
IInterfaceTable* ift = IPvXAddressResolver().findInterfaceTableOf(mod);
|
||||||
|
|
||||||
|
//set the local address
|
||||||
|
if (ift && ift->getNumInterfaces() > 1) { //interface index 0 == loopback
|
||||||
|
InterfaceEntry *ie = ift->getInterface(1);
|
||||||
|
localTA = TransportAddress(ie->ipv4Data()->getIPAddress());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
localTA = TransportAddress();
|
||||||
|
}
|
||||||
|
//set the port
|
||||||
|
localTA.setPort(int(par("localPort")));
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize the Moversight instance
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::initialize(int stage) {
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
if (stage != 3) return;
|
||||||
|
|
||||||
|
setLocalAddress();
|
||||||
|
|
||||||
|
app = NULL;
|
||||||
|
visu = NULL;
|
||||||
|
dispatcher = NULL;
|
||||||
|
simulationTrigger = NULL;
|
||||||
|
|
||||||
|
//set Socket
|
||||||
|
socket.setOutputGate(gate("udpOut"));
|
||||||
|
socket.bind(localTA.getPort());
|
||||||
|
|
||||||
|
//read the simulation parameter and setup the module
|
||||||
|
peerPlacingStrategyType = PeerPlacingStrategyType(int (par("peerPlacingStrategy")));
|
||||||
|
peerPlacingStrategyMetricType = PeerPlacingStrategyMetricType(int (par("peerPlacingStrategyMetric")));
|
||||||
|
maintanceMomentMetricType = MaintanceMomentMetricType((int) (par("maintanceMomentMetricType")));
|
||||||
|
failureDetectorType = NetworkFailureDetectorType(int (par("failureDetectorType")));
|
||||||
|
peerResourcesValue = PeerResources(PeerResources::ResourceValue(par("peerResourceValue")));
|
||||||
|
|
||||||
|
//read max cluster
|
||||||
|
maxClusterCount = int(par("maxClusterCount"));
|
||||||
|
maxPeerCount = int(par("maxPeerCount"));
|
||||||
|
|
||||||
|
// // wireless Nodes register in category we want to listen with
|
||||||
|
// if (getParentModule()->getSubmodule("wlan", 0)) {
|
||||||
|
// notificationBoard = dynamic_cast<NotificationBoard *> (getParentModule()->getSubmodule("notificationBoard"));
|
||||||
|
// if (!notificationBoard)
|
||||||
|
// std::cerr << "Could not find NotificationBoard module with name 'notificationBoard' " << getParentModule() << endl;
|
||||||
|
// else {
|
||||||
|
// //categories we are interested in
|
||||||
|
// notificationBoard->subscribe(this, NF_L2_ASSOCIATED_NEWAP);
|
||||||
|
// notificationBoard->subscribe(this, NF_L2_BEACON_LOST);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
app = NULL;
|
||||||
|
|
||||||
|
//load the proper test app
|
||||||
|
switch (int(par("testApp"))) {
|
||||||
|
|
||||||
|
case SPLIT_TEST_APPLICATION:
|
||||||
|
app = new SplitApplication(*this);
|
||||||
|
break;
|
||||||
|
case NFD_TEST_APPLICATION:
|
||||||
|
throw ParameterException("initialize - set up NFD_TEST_APPLICATION not implemented yet");
|
||||||
|
break;
|
||||||
|
case PEER_PLACING_TEST_APPLICATION:
|
||||||
|
app = new PeerplacingApplication(*this);
|
||||||
|
break;
|
||||||
|
case TEST_APPLICATION:
|
||||||
|
app = new TestApplication(*this);
|
||||||
|
break;
|
||||||
|
case MERGE_TEST_APPLICATION:
|
||||||
|
app = new MergeApplication(*this);
|
||||||
|
break;
|
||||||
|
case ALM_TEST_APPLICATION:
|
||||||
|
app = new ApplicationLevelMulticastTestApplication(*this);
|
||||||
|
break;
|
||||||
|
case PARTITION_APPLICATION:
|
||||||
|
app = new PartitionApplication(*this);
|
||||||
|
break;
|
||||||
|
case PENDING_TEST_APPLICATION:
|
||||||
|
app = new PendingTestApplication(*this);
|
||||||
|
break;
|
||||||
|
case MAINTANCE_APPLICATION:
|
||||||
|
app = new MaintanceApplication(*this);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw ParameterException("initialize - no valid value for parameter \"application\" specified");
|
||||||
|
break;
|
||||||
|
}//end switch
|
||||||
|
|
||||||
|
enableRecordStats = par("recordStat").boolValue();
|
||||||
|
|
||||||
|
if(enableRecordStats){
|
||||||
|
numMessagesReceived = 0;
|
||||||
|
numMessagesSent = 0;;
|
||||||
|
}//end if
|
||||||
|
|
||||||
|
|
||||||
|
setNFDEnabled(par("enableNFD").boolValue());
|
||||||
|
|
||||||
|
//initialize print debug parameter
|
||||||
|
setPrintDebugAPP(par("printDebugAPP").boolValue());
|
||||||
|
setPrintDebugDIS(par("printDebugDIS").boolValue());
|
||||||
|
setPrintDebugNFD(par("printDebugNFD").boolValue());
|
||||||
|
setPrintDebugMT(par("printDebugMT").boolValue());
|
||||||
|
setPrintDebugMS(par("printDebugMS").boolValue());
|
||||||
|
setPrintDebugTC(par("printDebugTC").boolValue());
|
||||||
|
setPrintDebugST(par("printDebugST").boolValue());
|
||||||
|
setPrintDebugCT(par("printDebugCT").boolValue());
|
||||||
|
setPrintDebugUT(par("printDebugUT").boolValue());
|
||||||
|
setPrintDebugMOB(par("printDebugMOB").boolValue());
|
||||||
|
setPrintDebugVISU(par("printDebugVISU").boolValue());
|
||||||
|
setPrintDebugES(par("printDebugES").boolValue());
|
||||||
|
setPrintDebugUC(par("printDebugUC").boolValue());
|
||||||
|
setPrintDebugAC(par("printDebugAC").boolValue());
|
||||||
|
|
||||||
|
//start moversight
|
||||||
|
dispatcher = new Dispatcher(*this, *app);
|
||||||
|
|
||||||
|
//initialize the test application
|
||||||
|
app->setDispatcher(dispatcher);
|
||||||
|
app->initialise();
|
||||||
|
|
||||||
|
dispatcher->initialise();
|
||||||
|
|
||||||
|
simulationTrigger = new cMessage("simulationTrigger");
|
||||||
|
if (par("simulationTrigger").boolValue()) {
|
||||||
|
scheduleAt(simTime() + simulationTriggerTimeout, simulationTrigger);
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
//start the visualization
|
||||||
|
visu = new MoversightSimulationPeerStateVisualization(*dispatcher);
|
||||||
|
visu->initialise();
|
||||||
|
updateSimUI();
|
||||||
|
|
||||||
|
#else
|
||||||
|
stage = stage;
|
||||||
|
|
||||||
|
//set up the peerplacing stuff
|
||||||
|
peerPlacingStrategyType = BALANCED_PEER_PLACING;
|
||||||
|
peerPlacingStrategyMetricType = OUCMETRIC_CLUSTERSIZE;
|
||||||
|
maintanceMomentMetricType = RESOURCEVALUEMOMENTMETRIC;
|
||||||
|
failureDetectorType = BERTIER_DETECTOR;
|
||||||
|
maxClusterCount = 12;
|
||||||
|
maxPeerCount = 6;
|
||||||
|
|
||||||
|
// setLocalAddress();
|
||||||
|
dispatcher.initialise();
|
||||||
|
#endif
|
||||||
|
}//End initialize
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Finish method. Is called during shutdown of moversight.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::finish() {
|
||||||
|
#if OMNETPP
|
||||||
|
if(enableRecordStats){
|
||||||
|
recordScalar("messages_sent:count", numMessagesSent);
|
||||||
|
recordScalar("messages_received:count", numMessagesReceived);
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
if (app != NULL) {
|
||||||
|
app->finalise();
|
||||||
|
delete app;
|
||||||
|
app = NULL;
|
||||||
|
}//End if
|
||||||
|
if (visu != NULL) {
|
||||||
|
delete visu;
|
||||||
|
visu = NULL;
|
||||||
|
}//End if
|
||||||
|
if (dispatcher != NULL) {
|
||||||
|
delete dispatcher;
|
||||||
|
dispatcher = NULL;
|
||||||
|
}//End if
|
||||||
|
if (simulationTrigger != NULL) {
|
||||||
|
cancelAndDelete(simulationTrigger);
|
||||||
|
simulationTrigger = NULL;
|
||||||
|
}//end if
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handles received messages (from the socket) and timers.
|
||||||
|
* @param msg The received message to handle.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::handleMessage(cMessage *msg) {
|
||||||
|
|
||||||
|
// timer handling
|
||||||
|
if (msg->isSelfMessage()) {
|
||||||
|
|
||||||
|
cancelEvent(msg);
|
||||||
|
|
||||||
|
if (msg == simulationTrigger) {
|
||||||
|
handleSimulationTriggerTimer();
|
||||||
|
}//End if
|
||||||
|
else if (dynamic_cast<MoversightTimer *> (msg)) {
|
||||||
|
MoversightTimer* timer = dynamic_cast<MoversightTimer*> (msg);
|
||||||
|
timer->fire();
|
||||||
|
dispatcher->getEventService().process();
|
||||||
|
}//End else if
|
||||||
|
}//End if
|
||||||
|
// not a timer
|
||||||
|
else {
|
||||||
|
|
||||||
|
if(enableRecordStats) numMessagesReceived++;
|
||||||
|
|
||||||
|
MoversightMessage * mMsg = dynamic_cast<MoversightMessage *> (msg);
|
||||||
|
|
||||||
|
if (mMsg != NULL) {
|
||||||
|
GenericTime arrivalTime = GenericTime::currentTime();
|
||||||
|
mMsg->setArrivalTime(arrivalTime);
|
||||||
|
dispatcher->handleMessage(mMsg);
|
||||||
|
delete msg;
|
||||||
|
msg = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MOV_DEBUG << "ERROR: handleMessage - unknown message type - drop message";
|
||||||
|
}
|
||||||
|
}//End else
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief test code method
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::handleSimulationTriggerTimer() {
|
||||||
|
if (app != NULL) {
|
||||||
|
app->startTestCase(int(par("testCase")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This method updates the presentation of a peer within the omnett++ visualization. In particular, the
|
||||||
|
* icon of the peer is change depending on the role of the peer (master or slave).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::updateSimUI() {
|
||||||
|
if (visu != NULL) {
|
||||||
|
visu->updateSimUI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Displays a message bubble at the omnet sim ui.
|
||||||
|
* @param msg
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::bubble(const char* msg) {
|
||||||
|
getParentModule()->bubble(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Schedules the simulation trigger timer.
|
||||||
|
* @param time The duration to the determined schedule.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::scheduleTestCase(simtime_t time) {
|
||||||
|
|
||||||
|
cancelEvent(simulationTrigger);
|
||||||
|
scheduleAt((simTime() + time), simulationTrigger);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief receive notifications from notificationBoard
|
||||||
|
* @param category to identifiy the matter of changed Notification
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::receiveChangeNotification(int category, const cPolymorphic *details) {
|
||||||
|
|
||||||
|
switch (category) {
|
||||||
|
case NF_L2_ASSOCIATED_NEWAP:
|
||||||
|
std::cerr << dispatcher->getLocalPeer().getPeerID() << " Connection to an AP established " << endl;
|
||||||
|
//connectionEstablished();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NF_L2_BEACON_LOST:
|
||||||
|
std::cerr << dispatcher->getLocalPeer().getPeerID() << " Connection to an AP lost" << endl;
|
||||||
|
// dispatcher.signalConnectionLost();
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the user selected peer placing strategy type.
|
||||||
|
* @see PeerPlacingStrategy.h
|
||||||
|
* @return The selected strategy type.
|
||||||
|
*/
|
||||||
|
const PeerPlacingStrategyType &
|
||||||
|
Moversight::getPeerPlacingStrategyType() const {
|
||||||
|
return peerPlacingStrategyType;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PeerPlacingStrategyMetricType &
|
||||||
|
Moversight::getPeerPlacingStrategyMetricType() const {
|
||||||
|
return peerPlacingStrategyMetricType;
|
||||||
|
}
|
||||||
|
|
||||||
|
const MaintanceMomentMetricType &
|
||||||
|
Moversight::getMaintanceMomentMetricType() const {
|
||||||
|
return maintanceMomentMetricType;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PeerResources &
|
||||||
|
Moversight::getPeerResources() const {
|
||||||
|
return peerResourcesValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the user selected failure detector type.
|
||||||
|
* @see FailureDetectorType.h
|
||||||
|
* @return The selected failure detector type.
|
||||||
|
*/
|
||||||
|
const NetworkFailureDetectorType &
|
||||||
|
Moversight::getFailureDetectorType() const {
|
||||||
|
return failureDetectorType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the maximal number of clusters
|
||||||
|
* @return number of clusters
|
||||||
|
*/
|
||||||
|
size_t
|
||||||
|
Moversight::getMaxClusterCount() {
|
||||||
|
return maxClusterCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the maximal number of peers in one cluster
|
||||||
|
* @return number of peers
|
||||||
|
*/
|
||||||
|
size_t
|
||||||
|
Moversight::getMaxPeerCount() {
|
||||||
|
return maxPeerCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends a omnet message to a peer, identified by its transport address
|
||||||
|
* @param msg The message to send
|
||||||
|
* @param toPeerTA The destination address
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::sendToPeer( const MoversightMessage& msg, const TransportAddress & toPeerTA) {
|
||||||
|
#if OMNETPP
|
||||||
|
if(enableRecordStats) numMessagesSent++;
|
||||||
|
|
||||||
|
sendToUDP(msg, toPeerTA);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void
|
||||||
|
Moversight::sendToPeer(MoversightMessage & msg, const TransportAddress & toPeerTA) {
|
||||||
|
delegateSend(msg, toPeerTA);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sending the Message via UDP to the given TransportAddress
|
||||||
|
* @param packet The Message to send
|
||||||
|
* @param destAddr The destination transport address of the message
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::sendToUDP( const MoversightMessage& packet, const TransportAddress& destAddr) {
|
||||||
|
|
||||||
|
cPacket* msg = (cPacket *) packet.dup(); //without -> no local deletion of send message
|
||||||
|
|
||||||
|
// send message to UDP, with the appropriate control info attached
|
||||||
|
msg->setKind(UDP_C_DATA);
|
||||||
|
msg->setByteLength(sizeof packet);
|
||||||
|
|
||||||
|
socket.sendTo(msg, destAddr.getHostAddress(), destAddr.getPort());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assignment operator.
|
||||||
|
* @param other The instance to assign.
|
||||||
|
* @return A reference of the current object.
|
||||||
|
*/
|
||||||
|
Moversight & Moversight::operator =(Moversight const & other) {
|
||||||
|
|
||||||
|
if (this == &other) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseMoversight::operator=(other);
|
||||||
|
dispatcher = other.dispatcher;
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
simulationTrigger = other.simulationTrigger;
|
||||||
|
app = other.app;
|
||||||
|
numMessagesReceived = other.numMessagesReceived;
|
||||||
|
numMessagesSent = other.numMessagesSent;
|
||||||
|
maxClusterCount = other.maxClusterCount;
|
||||||
|
maxPeerCount = other.maxPeerCount;
|
||||||
|
enableRecordStats = other.enableRecordStats;
|
||||||
|
|
||||||
|
socket = other.socket;
|
||||||
|
#endif
|
||||||
|
peerPlacingStrategyType = other.peerPlacingStrategyType;
|
||||||
|
peerPlacingStrategyMetricType = other.peerPlacingStrategyMetricType;
|
||||||
|
maintanceMomentMetricType = other.maintanceMomentMetricType;
|
||||||
|
failureDetectorType = other.failureDetectorType;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}//End
|
||||||
|
|
||||||
|
#if UBEEME
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Delegates the data to the receiver
|
||||||
|
* @param buffer ByteArray of data
|
||||||
|
* @param from PeerID from the sender
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::delegateReceive(ByteArray const &buffer, PeerID const &from) {
|
||||||
|
DatagramInput<PeerID>::delegateReceive(buffer, from);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Chains the given DatagramInput to this DatagramOutput. So it can be used for delegating.
|
||||||
|
* @param input Input to chain.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::chainDown(DatagramInput<TransportAddress> *input) {
|
||||||
|
|
||||||
|
DatagramOutput<TransportAddress>::chainDown(input);
|
||||||
|
|
||||||
|
if (!initNetworkInfos()) {
|
||||||
|
MOV_DEBUG << "Cannot init network informations.";
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatcher.initialise();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Unchains the given input from this DatagramOutput.
|
||||||
|
* @param input Input to unchain.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::unchainDown(DatagramInput<TransportAddress> *input) {
|
||||||
|
DatagramOutput<TransportAddress>::unchainDown(input);
|
||||||
|
infoObject.clear();
|
||||||
|
disconnectReceiver();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Moversight::initNetworkInfos() {
|
||||||
|
DatagramInput<TransportAddress> *input = 0;
|
||||||
|
if (!inputList.empty()) {
|
||||||
|
input = inputList.front();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input && infoObject.isNull()) {
|
||||||
|
typedef std::list<QSharedPointer<UDPInfoObject> > UDPInfoObjectList;
|
||||||
|
UDPInfoObjectList objectList;
|
||||||
|
UDPInfoObjectList::iterator it;
|
||||||
|
UDPEndpoint *currentUDPEndpoint = 0;
|
||||||
|
InformationBroker::getInstance()->getInformationObjectList(objectList);
|
||||||
|
|
||||||
|
for (it = objectList.begin(); it != objectList.end(); ++it) {
|
||||||
|
currentUDPEndpoint = (*it)->getOwner();
|
||||||
|
if (input == currentUDPEndpoint || input->hasInputNodeInChain(currentUDPEndpoint)) {
|
||||||
|
infoObject = *it;
|
||||||
|
connectReceiver(currentUDPEndpoint);
|
||||||
|
connectAll();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* @param e The EventContainer
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::stateChanged(EventContainer e) {
|
||||||
|
UDPStateChangedEvent *changed = e.decapsulate<UDPStateChangedEvent > ();
|
||||||
|
if (changed) {
|
||||||
|
if (changed->getUDPState() == ubeeme::UDPEndpoint::UNCONNECTED_STATE) {
|
||||||
|
MOV_DEBUG << "UDP unconnected, delete information object.";
|
||||||
|
infoObject.clear();
|
||||||
|
disconnectReceiver();
|
||||||
|
|
||||||
|
initNetworkInfos();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatcher.initialise();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Method checks whether the given DatagramInput is situated under the chain.
|
||||||
|
* Therefor bool NetworkOutput::hasNodeInChain(NETWORK_INPUT const *input) const is called.
|
||||||
|
* In case it's a DatagramOutput
|
||||||
|
*
|
||||||
|
* @param input searched DatagramInput
|
||||||
|
* @return if the DatagramInput searched for is below us
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
Moversight::hasInputNodeInChain(DatagramInput<PeerID> const * /*input*/) const {
|
||||||
|
return false;
|
||||||
|
}//End
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This is the callback, that gets called when the down linked node received data and forwards those to us.
|
||||||
|
* @param buffer all the received data
|
||||||
|
* @param from - sender of the data
|
||||||
|
* @param fromInput - reference to the linked node, from whom we got the data (can be ignored in most cases)
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::handleReceive(ByteArray const &buffer, TransportAddress const &from, DatagramInput<TransportAddress> const * /*fromInput*/) {
|
||||||
|
SharedPointer<NetworkMessage> received = factory.NetworkMessageFactory::createMessage(buffer, from);
|
||||||
|
if (!received.isNull()) {
|
||||||
|
dispatcher.handleMessage((MoversightMessage *) received.data());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief this is the callback, that gets called when the up linked node wants to send data to us
|
||||||
|
* @param buffer - the data to be send
|
||||||
|
* @param to - the receiver of the data
|
||||||
|
* @param fromOutput - reference to the linked node that wants to send the data to us (can be ignored in most cases)
|
||||||
|
* @return - true on successfull sending, otherwise false.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
Moversight::handleSend(ByteArray const &buffer, PeerID const &/*to = 0*/, DatagramOutput<PeerID> const * /*fromOutput = 0 */) {
|
||||||
|
|
||||||
|
GroupData data; //("DT");
|
||||||
|
|
||||||
|
data.setData(buffer);
|
||||||
|
dispatcher.sendMessage(data);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Invite a peer to the group
|
||||||
|
* @param destTa The transportAddress of the peer to invite
|
||||||
|
* @param pDesc the peerDescription
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::invitePeer(TransportAddress & destTa, PeerDescription & pDesc) {
|
||||||
|
dispatcher.invitePeer(destTa, pDesc);
|
||||||
|
}//End
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Cancel the invitation
|
||||||
|
* @param ta The transportAddress to send the cancellation
|
||||||
|
* @param reason Why the invitation is turned down
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::cancelInvitation(TransportAddress & ta, std::string reason) {
|
||||||
|
dispatcher.cancelInvitation(ta, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Accept the Invitation
|
||||||
|
* @param inv The invitation to accept
|
||||||
|
* @param comment A comment
|
||||||
|
* @param pDesc PeerDescription
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::acceptInvitation(Invitation & inv, std::string comment, PeerDescription & pDesc) {
|
||||||
|
dispatcher.acceptInvitation(inv, comment, pDesc);
|
||||||
|
}//End
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reject the invitation
|
||||||
|
* @param inv The invitation to be rejected
|
||||||
|
* @param reason Why it's rejected
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::rejectInvitation(Invitation & inv, std::string reason) {
|
||||||
|
dispatcher.rejectInvitation(inv, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Leave the group
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::leaveGroup() {
|
||||||
|
dispatcher.leaveGroup();
|
||||||
|
}//End
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Start a split
|
||||||
|
* @param options The split options
|
||||||
|
* @param size The number of the splitting peers
|
||||||
|
* @param splitPeers PeerIDList of the splitting peers
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::splitGroup(unsigned char options, PeerIDList splitPeers) {
|
||||||
|
dispatcher.splitGroup(options, splitPeers);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Start a group Merge
|
||||||
|
* @param destTa The other Mergedirector
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::mergeGroup(TransportAddress & destTa) {
|
||||||
|
dispatcher.mergeGroup(destTa);
|
||||||
|
}//End
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Accept the merge request
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::acceptGroupMerge() {
|
||||||
|
dispatcher.acceptGroupMerge();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reject the merge request
|
||||||
|
* @param reason Why it's rejected
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Moversight::rejectGroupMerge(std::string & reason) {
|
||||||
|
dispatcher.rejectGroupMerge(reason);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
179
uni/masterarbeit/source/moversight/Moversight.h
Normal file
179
uni/masterarbeit/source/moversight/Moversight.h
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MOVERSIGHT_H
|
||||||
|
#define MOVERSIGHT_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* File: Moversight.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on September 20, 2010, 1:30 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "BaseMoversight.h"
|
||||||
|
#include "mrs/metric/MaintanceMomentMetricTypes.h"
|
||||||
|
#include "ms/placingstrategy/PeerPlacingStrategyType.h"
|
||||||
|
#include "common/transport/msg/MoversightMessage.h"
|
||||||
|
#include "fd/NetworkFailureDetectorType.h"
|
||||||
|
|
||||||
|
#if UBEEME
|
||||||
|
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
#include "mt/msg/GroupData.h"
|
||||||
|
#include "app/MoversightCallback.h"
|
||||||
|
#include "common/transport/MoversightMessageFactory.h"
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "core/network/networking_nodes/datagram_input.h"
|
||||||
|
#include "core/network/networking_nodes/datagram_output.h"
|
||||||
|
#include "core/network/udp_endpoint.h"
|
||||||
|
#include "core/network/udp_node_event_receiver.h"
|
||||||
|
#include "core/network/udp_info_object.h"
|
||||||
|
#include "common/byte_array.h"
|
||||||
|
#include <QSharedPointer>
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include "simutils/MoversightSimulationPeerStateVisualization.h"
|
||||||
|
//omnet
|
||||||
|
#include "UDPSocket.h"
|
||||||
|
#include "NotificationBoard.h"
|
||||||
|
#include "INotifiable.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MulticastMessage;
|
||||||
|
class ExteriorMessage;
|
||||||
|
class Dispatcher;
|
||||||
|
class MoversightCallback;
|
||||||
|
class Application;
|
||||||
|
|
||||||
|
#if UBEEME
|
||||||
|
class MOV_EXPORT Moversight : public BaseMoversight, public DatagramInput<PeerID>, public DatagramOutput<TransportAddress>, public UDPNodeEventReceiver {
|
||||||
|
public:
|
||||||
|
|
||||||
|
Moversight(MoversightCallback & callBack);
|
||||||
|
~Moversight();
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* @brief Base OMNeT++ Module for Moversight.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class Moversight
|
||||||
|
*/
|
||||||
|
class Moversight : public BaseMoversight, public INotifiable, public cSimpleModule {
|
||||||
|
public:
|
||||||
|
|
||||||
|
void scheduleTestCase(simtime_t time);
|
||||||
|
void updateSimUI();
|
||||||
|
void bubble(const char* msg);
|
||||||
|
|
||||||
|
void receiveChangeNotification(int category, const cPolymorphic *details);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void sendToPeer( const MoversightMessage& msg, const TransportAddress& toPeerTA);
|
||||||
|
|
||||||
|
void connectionLost();
|
||||||
|
void connectionEstablished();
|
||||||
|
|
||||||
|
size_t getMaxClusterCount();
|
||||||
|
size_t getMaxPeerCount();
|
||||||
|
const PeerPlacingStrategyType & getPeerPlacingStrategyType() const;
|
||||||
|
const PeerPlacingStrategyMetricType & getPeerPlacingStrategyMetricType() const;
|
||||||
|
const MaintanceMomentMetricType & getMaintanceMomentMetricType() const;
|
||||||
|
const NetworkFailureDetectorType & getFailureDetectorType() const;
|
||||||
|
const PeerResources & getPeerResources() const;
|
||||||
|
|
||||||
|
Moversight & operator=(Moversight const & other);
|
||||||
|
virtual TransportAddress & getLocalAddress();
|
||||||
|
|
||||||
|
virtual void initialize(int stage);
|
||||||
|
|
||||||
|
#if UBEEME
|
||||||
|
//call backs
|
||||||
|
bool hasInputNodeInChain(DatagramInput<PeerID> const *input) const;
|
||||||
|
virtual void delegateReceive(ByteArray const &buffer, PeerID const &from);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Chains the given DatagramInput to this DatagramOutput. So it can be used for delegating.
|
||||||
|
* @param input Input to chain.
|
||||||
|
*/
|
||||||
|
virtual void chainDown(DatagramInput<TransportAddress> *input);
|
||||||
|
/**
|
||||||
|
* @brief Unchains the given input from this DatagramOutput.
|
||||||
|
* @param input Input to unchain.
|
||||||
|
*/
|
||||||
|
virtual void unchainDown(DatagramInput<TransportAddress> *input);
|
||||||
|
|
||||||
|
virtual void stateChanged(EventContainer e);
|
||||||
|
|
||||||
|
bool handleSend(const ByteArray & buffer, PeerID const &to = 0, DatagramOutput<PeerID> const *fromOutput = 0);
|
||||||
|
void handleReceive(ByteArray const & buffer, TransportAddress const & from, DatagramInput<TransportAddress> const *fromInput);
|
||||||
|
|
||||||
|
void invitePeer(TransportAddress & ta, PeerDescription & pDesc);
|
||||||
|
void cancelInvitation(TransportAddress & ta, std::string reason);
|
||||||
|
|
||||||
|
void acceptInvitation(Invitation & inv, std::string comment, PeerDescription & pDesc);
|
||||||
|
void rejectInvitation(Invitation & inv, std::string reason);
|
||||||
|
|
||||||
|
void leaveGroup();
|
||||||
|
|
||||||
|
void splitGroup(unsigned char options, PeerIDList splitPeers);
|
||||||
|
|
||||||
|
void mergeGroup(TransportAddress & destTa);
|
||||||
|
void acceptGroupMerge();
|
||||||
|
void rejectGroupMerge(std::string & reason);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void sendToUDP( const MoversightMessage& msg, const TransportAddress & destAddr);
|
||||||
|
|
||||||
|
virtual int numInitStages() const { return 4; }
|
||||||
|
#if OMNETPP
|
||||||
|
virtual void handleMessage(cMessage *msg);
|
||||||
|
#endif
|
||||||
|
virtual void finish();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void handleSimulationTriggerTimer();
|
||||||
|
void setLocalAddress();
|
||||||
|
|
||||||
|
PeerPlacingStrategyType peerPlacingStrategyType;
|
||||||
|
PeerPlacingStrategyMetricType peerPlacingStrategyMetricType;
|
||||||
|
PeerResources peerResourcesValue;
|
||||||
|
|
||||||
|
MaintanceMomentMetricType maintanceMomentMetricType;
|
||||||
|
NetworkFailureDetectorType failureDetectorType;
|
||||||
|
|
||||||
|
TransportAddress localTA;
|
||||||
|
#if UBEEME
|
||||||
|
bool initNetworkInfos();
|
||||||
|
MoversightMessageFactory factory;
|
||||||
|
QSharedPointer<UDPInfoObject> infoObject;
|
||||||
|
Dispatcher dispatcher;
|
||||||
|
#else
|
||||||
|
MoversightSimulationPeerStateVisualization * visu;
|
||||||
|
UDPSocket socket;
|
||||||
|
|
||||||
|
cMessage * simulationTrigger;
|
||||||
|
Application * app;
|
||||||
|
Dispatcher * dispatcher;
|
||||||
|
// NotificationBoard * notificationBoard;
|
||||||
|
|
||||||
|
size_t numMessagesReceived;
|
||||||
|
size_t numMessagesSent;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
size_t maxClusterCount;
|
||||||
|
size_t maxPeerCount;
|
||||||
|
bool enableRecordStats;
|
||||||
|
|
||||||
|
|
||||||
|
}; //End class
|
||||||
|
}//End namespace
|
||||||
|
}//End namespace
|
||||||
|
|
||||||
|
#endif // MOVERSIGHT_H
|
||||||
50
uni/masterarbeit/source/moversight/Moversight.ned
Normal file
50
uni/masterarbeit/source/moversight/Moversight.ned
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
package ubeeme.moversight;
|
||||||
|
@namespace(ubeeme::moversight);
|
||||||
|
|
||||||
|
simple Moversight
|
||||||
|
{
|
||||||
|
parameters:
|
||||||
|
|
||||||
|
bool simulationTrigger = default(false);
|
||||||
|
|
||||||
|
//see ApplicationType in file Application.h
|
||||||
|
int testApp = default(0);
|
||||||
|
int testCase = default(0);
|
||||||
|
|
||||||
|
//see PeerPlacingStragyType in file PeerPlacingStrategy.h
|
||||||
|
int peerPlacingStrategy = default(0);
|
||||||
|
//see FailureDetectorType in file FailureDetectorType.h
|
||||||
|
int failureDetectorType = default(0);
|
||||||
|
|
||||||
|
bool enableNFD = default(false);
|
||||||
|
|
||||||
|
bool printDebugAC = default(true);
|
||||||
|
bool printDebugUC = default(true);
|
||||||
|
bool printDebugNFD = default(true);
|
||||||
|
bool printDebugDIS = default(true);
|
||||||
|
bool printDebugAPP = default(true);
|
||||||
|
bool printDebugMT = default(true);
|
||||||
|
bool printDebugMS = default(true);
|
||||||
|
bool printDebugTC = default(true);
|
||||||
|
bool printDebugST = default(true);
|
||||||
|
bool printDebugCT = default(true);
|
||||||
|
bool printDebugUT = default(true);
|
||||||
|
bool printDebugMOB = default(true);
|
||||||
|
bool printDebugVISU = default(true);
|
||||||
|
bool printDebugES = default(true);
|
||||||
|
bool recordStat = default(true);
|
||||||
|
int maxClusterCount = default(3);
|
||||||
|
int maxPeerCount = default(3);
|
||||||
|
int numberOfPeers = default(0);
|
||||||
|
int numberOfMobilePeers = default(0);
|
||||||
|
|
||||||
|
int localPort = default(100);
|
||||||
|
int destPort = default(100);
|
||||||
|
string destAddresses = default("");
|
||||||
|
|
||||||
|
|
||||||
|
gates:
|
||||||
|
|
||||||
|
output udpOut;
|
||||||
|
input udpIn;
|
||||||
|
}
|
||||||
80
uni/masterarbeit/source/moversight/MoversightTimerSettings.h
Normal file
80
uni/masterarbeit/source/moversight/MoversightTimerSettings.h
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* File: MoversightTimerTypes.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on February 14, 2011, 10:54 AM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MOVERSIGHTTIMERTYPES_H
|
||||||
|
#define MOVERSIGHTTIMERTYPES_H
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Define the general settings for a timer (number of retries and so on).
|
||||||
|
*/
|
||||||
|
enum MoversightTimerSettings {
|
||||||
|
//global setting
|
||||||
|
NUMBER_OF_MAX_RETRIES = 3,
|
||||||
|
|
||||||
|
MT_NUMBER_OF_MAX_RETRIES = NUMBER_OF_MAX_RETRIES,
|
||||||
|
FD_NUMBER_OF_MAX_RETRIES = NUMBER_OF_MAX_RETRIES,
|
||||||
|
MS_NUMBER_OF_MAX_RETRIES = NUMBER_OF_MAX_RETRIES,
|
||||||
|
PD_NUMBER_OF_MAX_RETRIES = NUMBER_OF_MAX_RETRIES,
|
||||||
|
MOB_NUMBER_OF_MAX_RETRIES = 1,
|
||||||
|
MERGE_NUMBER_OF_MAX_RETRIES = NUMBER_OF_MAX_RETRIES,
|
||||||
|
SPLIT_NUMBER_OF_MAX_RETRIES = NUMBER_OF_MAX_RETRIES
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines the timeout for the moversight timers.
|
||||||
|
*/
|
||||||
|
enum MoversightTimeout {
|
||||||
|
#if OMNETPP
|
||||||
|
AVERAGE_DELAY = 1,
|
||||||
|
#else
|
||||||
|
AVERAGE_DELAY = 6000,
|
||||||
|
|
||||||
|
#endif
|
||||||
|
//mt
|
||||||
|
LT_TIMEOUT = AVERAGE_DELAY,
|
||||||
|
GT_TIMEOUT = LT_TIMEOUT + (LT_TIMEOUT * MT_NUMBER_OF_MAX_RETRIES) + 1,
|
||||||
|
GT_AWAIT_TIMEOUT = GT_TIMEOUT + (GT_TIMEOUT * MT_NUMBER_OF_MAX_RETRIES) + 1,
|
||||||
|
GARBAGE_TIMEOUT = GT_AWAIT_TIMEOUT + (GT_AWAIT_TIMEOUT * MT_NUMBER_OF_MAX_RETRIES) + 1,
|
||||||
|
DT_DELIVERY_TIMEOUT = GT_AWAIT_TIMEOUT + 2,
|
||||||
|
//ms
|
||||||
|
JOIN_ABORT_TO_INVITEE_TIMEOUT = (5 * AVERAGE_DELAY),
|
||||||
|
JOIN_ANNOUNCE_TIMEOUT = DT_DELIVERY_TIMEOUT + (DT_DELIVERY_TIMEOUT * MS_NUMBER_OF_MAX_RETRIES) + 1,
|
||||||
|
JOIN_ABORT_TO_INVITER_TIMEOUT = (4 * AVERAGE_DELAY),
|
||||||
|
JOIN_ABORT_TO_INVITER_TIMEOUT_MISSING_ROSTER = JOIN_ANNOUNCE_TIMEOUT + (2 * AVERAGE_DELAY),
|
||||||
|
LEAVE_ANNOUNCE_TIMEOUT = JOIN_ANNOUNCE_TIMEOUT,
|
||||||
|
//tc
|
||||||
|
SPLIT_ABORT_TIMEOUT = DT_DELIVERY_TIMEOUT + (DT_DELIVERY_TIMEOUT * SPLIT_NUMBER_OF_MAX_RETRIES) + 1,
|
||||||
|
MERGE_REJECT_TO_INVITEE_TIMEOUT = (4 * AVERAGE_DELAY),
|
||||||
|
MERGE_ABORT_TO_INVITER_GROUP_TIMEOUT = (4 * AVERAGE_DELAY),
|
||||||
|
MERGE_ABORT_TO_INVITEE_GROUP_TIMEOUT = MERGE_ABORT_TO_INVITER_GROUP_TIMEOUT + (4 * AVERAGE_DELAY * MERGE_NUMBER_OF_MAX_RETRIES),
|
||||||
|
MERGE_ABORT_TIMEOUT = DT_DELIVERY_TIMEOUT + (DT_DELIVERY_TIMEOUT * MERGE_NUMBER_OF_MAX_RETRIES) + 1,
|
||||||
|
MERGE_ROLLBACK_TIMEOUT = MERGE_ABORT_TO_INVITER_GROUP_TIMEOUT + DT_DELIVERY_TIMEOUT + (DT_DELIVERY_TIMEOUT * MERGE_NUMBER_OF_MAX_RETRIES) + 1,
|
||||||
|
//MOB
|
||||||
|
GROUP_CLOSED_CAUSED_BY_CONNECTION_LOST_TIMEOUT = LEAVE_ANNOUNCE_TIMEOUT,
|
||||||
|
REJOIN_ROSTER_REQUEST_TIMEOUT = 1,
|
||||||
|
REJOIN_TIMEOUT = 20,
|
||||||
|
AR_TIMEOUT = 5,
|
||||||
|
//ut
|
||||||
|
UT_RETRANSMIT_TIMEOUT = DT_DELIVERY_TIMEOUT + (DT_DELIVERY_TIMEOUT * NUMBER_OF_MAX_RETRIES) + 1,
|
||||||
|
//nfd
|
||||||
|
DETECTION_TIMEOUT = 8 * AVERAGE_DELAY,
|
||||||
|
PARTITION_TIMEOUT = 2 * AVERAGE_DELAY,
|
||||||
|
ND_TIMEOUT = 2 * AVERAGE_DELAY,
|
||||||
|
//rvd
|
||||||
|
RESOURCE_VALUE_TIMEOUT = 1 * AVERAGE_DELAY
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* MOVERSIGHTTIMERTYPES_H */
|
||||||
|
|
||||||
122
uni/masterarbeit/source/moversight/app/Application.cc
Normal file
122
uni/masterarbeit/source/moversight/app/Application.cc
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* File: Application.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on November 10, 2011, 03:37 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
#include "Moversight.h"
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
#include "PeerDescription.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param m A reference to the moversight instance
|
||||||
|
*/
|
||||||
|
Application::Application(Moversight & m, std::string name) :
|
||||||
|
ObjectListener(name),
|
||||||
|
module(m),
|
||||||
|
dis(NULL),
|
||||||
|
candidatesIndex(0),
|
||||||
|
initApp(true) {
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
Application::Application() : module(NULL), dis(NULL), candidatesIndex(0), initApp(true) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
Application::~Application() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assignment operator.
|
||||||
|
* @param Application to copy.
|
||||||
|
*/
|
||||||
|
Application &
|
||||||
|
Application::operator =(const Application& other) {
|
||||||
|
|
||||||
|
if (this != &other) {
|
||||||
|
setServiceName(other.getServiceName());
|
||||||
|
module = other.module;
|
||||||
|
dis = other.dis;
|
||||||
|
candidates = other.candidates;
|
||||||
|
candidatesIndex = other.candidatesIndex;
|
||||||
|
initApp = other.initApp;
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the dispatcher call back to the test application.
|
||||||
|
*
|
||||||
|
* This method sets the dispatcher call back at the current test application instance.
|
||||||
|
* It is important to run this method before the testcase itself is executed.
|
||||||
|
* @param d The dispatcher to set.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Application::setDispatcher(Dispatcher * d) {
|
||||||
|
dis = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Application::initialise() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Application::finalise() {
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UBEEME
|
||||||
|
|
||||||
|
void
|
||||||
|
Application::setMoversight(Moversight * m) {
|
||||||
|
module = m;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Callback method. This method is called by moversight to signal that the local peer have receive a group data message.
|
||||||
|
* @param data The received group data.
|
||||||
|
* @param sender The sending peer ID.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Application::receiveGroupData(const GroupData & /* data */, const PeerID /* sender */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called, have the local peer received a stream data message.
|
||||||
|
* @param data The received message.
|
||||||
|
* @param sender The sender of the message.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Application::receiveStreamMessage(const StreamMessage & /* data */, const PeerID /* sender */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called, have the local peer receive a stream data message.
|
||||||
|
* @param data The received message.
|
||||||
|
* @param sender The sender of the message.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Application::receiveUnicastMessage(const UnicastMessage & /* data */, const PeerID /* sender */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // #if OMNETPP
|
||||||
|
}
|
||||||
|
}
|
||||||
120
uni/masterarbeit/source/moversight/app/Application.h
Normal file
120
uni/masterarbeit/source/moversight/app/Application.h
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* File: Application.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on July 22, 2010, 10:56 AM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef APPLICATION_H
|
||||||
|
#define APPLICATION_H
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "common/transport/TransportAddressList.h"
|
||||||
|
#include "event/ObjectListener.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines for each test application a value, configured within the omnet.ini files and moversight to
|
||||||
|
* select the test application to run.
|
||||||
|
*/
|
||||||
|
enum ApplicationType {
|
||||||
|
TEST_APPLICATION = 0,
|
||||||
|
SPLIT_TEST_APPLICATION,
|
||||||
|
NFD_TEST_APPLICATION,
|
||||||
|
PEER_PLACING_TEST_APPLICATION,
|
||||||
|
MERGE_TEST_APPLICATION,
|
||||||
|
ALM_TEST_APPLICATION, //5
|
||||||
|
PARTITION_APPLICATION,
|
||||||
|
PENDING_TEST_APPLICATION, //7
|
||||||
|
MAINTANCE_APPLICATION
|
||||||
|
};
|
||||||
|
|
||||||
|
class Moversight;
|
||||||
|
class Dispatcher;
|
||||||
|
|
||||||
|
class Invitation;
|
||||||
|
class PeerDescription;
|
||||||
|
class Peer;
|
||||||
|
|
||||||
|
class GroupData;
|
||||||
|
class StreamMessage;
|
||||||
|
class UnicastMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a small test application interface to test the moversight protocol.
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class Application
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @author Rober Noack
|
||||||
|
*/
|
||||||
|
class Application : public ObjectListener {
|
||||||
|
public:
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
Application(Moversight & m, std::string name);
|
||||||
|
#else
|
||||||
|
Application();
|
||||||
|
|
||||||
|
void setMoversight(Moversight * m);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Application& operator=(const Application & other);
|
||||||
|
|
||||||
|
virtual ~Application();
|
||||||
|
|
||||||
|
void setDispatcher(Dispatcher * d);
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
/**
|
||||||
|
* @brief Starts the given test case.
|
||||||
|
* @param i The number of the test case to start.
|
||||||
|
*/
|
||||||
|
virtual void startTestCase(unsigned int i) = 0;
|
||||||
|
|
||||||
|
virtual void receiveGroupData(const GroupData & data, const PeerID sender);
|
||||||
|
virtual void receiveStreamMessage(const StreamMessage & data, const PeerID sender);
|
||||||
|
virtual void receiveUnicastMessage(const UnicastMessage & data, const PeerID sender);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* @brief A reference to the moversight module, used to retrieve module information as the local transport address.
|
||||||
|
*/
|
||||||
|
#if OMNETPP
|
||||||
|
Moversight & module;
|
||||||
|
#else
|
||||||
|
Moversight * module;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A reference to the moversight dispatcher, used to access all moversight methods and services.
|
||||||
|
*/
|
||||||
|
Dispatcher * dis;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stores the transport addresses of the peers to invite.
|
||||||
|
*/
|
||||||
|
TransportAddressList candidates;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The points to the current peer to invite within the candidates list.
|
||||||
|
*/
|
||||||
|
size_t candidatesIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals, if the application is within its initialization phase. True, the app is within the initialise phase, false otherwise.
|
||||||
|
*/
|
||||||
|
bool initApp;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* APPLICATION_H */
|
||||||
|
|
||||||
@@ -0,0 +1,217 @@
|
|||||||
|
/*
|
||||||
|
* File: ApplicationLevelMulticastTestApplication.cc
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on February 17, 2012, 5:02 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ApplicationLevelMulticastTestApplication.h"
|
||||||
|
|
||||||
|
#include "../Moversight.h"
|
||||||
|
#include "../Dispatcher.h"
|
||||||
|
#include "../app/PeerDescription.h"
|
||||||
|
#include "../simutils/OmnetppIniUtils.h"
|
||||||
|
#include "StreamMessage.h"
|
||||||
|
#include "../simutils/statistics/VectorStatistic.h"
|
||||||
|
|
||||||
|
#include "ms/events/GroupClosedEvent.h"
|
||||||
|
#include "ms/events/GroupCreatedEvent.h"
|
||||||
|
#include "ms/events/JoinRequestEvent.h"
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#define DEBUG(msg) if (module.isPrintDebugAPP()) \
|
||||||
|
MOV_DEBUG << "APP@"<<(dis->getLocalState()==DISJOINED?"TA_":"");\
|
||||||
|
if(dis->getLocalState()==DISJOINED){MOV_DEBUG << module.getLocalAddress();}\
|
||||||
|
else{MOV_DEBUG<< dis->getMembershipService().getLocalID();}MOV_DEBUG<<" "<<msg<<std::endl;
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param m A reference to the moversight instance
|
||||||
|
*/
|
||||||
|
ApplicationLevelMulticastTestApplication::ApplicationLevelMulticastTestApplication(Moversight & m) : Application(m, "ApplicationLevelMulticastTestApplication") {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
ApplicationLevelMulticastTestApplication::~ApplicationLevelMulticastTestApplication() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::initialise() {
|
||||||
|
dis->subscribe<GroupClosedEvent>(this);
|
||||||
|
dis->subscribe<GroupCreatedEvent>(this);
|
||||||
|
dis->subscribe<JoinRequestEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::finalise() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Invites a peer to a the moversight group.
|
||||||
|
* @param ta The transport address of the peer to invite.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::invitePeer(TransportAddress & ta) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitePeer - invite peer at address " << ta;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
PeerDescription pDesc;
|
||||||
|
dis->invitePeer(ta, pDesc);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends dummy data to the group to simulate application traffic.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::sendData() {
|
||||||
|
|
||||||
|
DEBUG("sendData - stream dummy data to the group");
|
||||||
|
StreamMessage data;
|
||||||
|
dis->sendMessage(data);
|
||||||
|
|
||||||
|
VectorStatistic vs("sendStream");
|
||||||
|
vs.record(GenericTime::currentTime());
|
||||||
|
}//End
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the given test case.
|
||||||
|
* @param i The number of the test case to start.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::startTestCase(unsigned int i) {
|
||||||
|
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
testCase00();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
testCase01();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}//End switch
|
||||||
|
}//End startTestCase
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Executes test case 00
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::testCase00() {
|
||||||
|
|
||||||
|
int moduleIndex = module.getLocalAddress().getHostAddress().get4().getDByte(3);
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
|
||||||
|
candidates = OmnetppIniUtils::getDestinationAddressesFromOmnetppIni(module);
|
||||||
|
|
||||||
|
waitCounter = 5;
|
||||||
|
initApp = false;
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
if (moduleIndex == 1) { // starts counting at 1
|
||||||
|
|
||||||
|
//we have more candidates?
|
||||||
|
if (candidatesIndex < candidates.size()) {
|
||||||
|
if (waitCounter > 0) {
|
||||||
|
waitCounter--;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
invitePeer(candidates.get(candidatesIndex++));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sendData();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
|
||||||
|
}//End if
|
||||||
|
}//End testCase00
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Executes test case 01.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::testCase01() {
|
||||||
|
std::cerr << "TC01 not implemented yet" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called, have the local peer received a stream data message.
|
||||||
|
* @param data The received message.
|
||||||
|
* @param sender The sender of the message.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::receiveStreamMessage(const StreamMessage & data, const PeerID sender) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveStreamMessage - receive stream message from peer ID " << sender;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
VectorStatistic vs("receiveStream");
|
||||||
|
vs.record(GenericTime::currentTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinRequestEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::handleEvent(const JoinRequestEvent & e) {
|
||||||
|
|
||||||
|
DEBUG("invitationReceived - invitation received");
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationReceived - invitationID: " << e.getInvitation().getInvitationID() << " inviterID: " << e.getInvitation().getInviterID();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
// if(module.localAddress() == 1 || module.localAddress() == 3 ){
|
||||||
|
//
|
||||||
|
// MOV_DEBUG << "APP_invitationReceived@TA_" << module.localAddress() << " reject invitation" << endl;
|
||||||
|
// gc->rejectInvitaion(invitation, "peer placing strategy not supported");
|
||||||
|
//
|
||||||
|
// }//End if
|
||||||
|
// else{
|
||||||
|
|
||||||
|
DEBUG("invitationReceived - accept invitation");
|
||||||
|
PeerDescription pDesc;
|
||||||
|
PeerResources resources;
|
||||||
|
|
||||||
|
dis->acceptInvitation(e.getInvitation(), "accept invitation", pDesc, resources);
|
||||||
|
|
||||||
|
// }//End else
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming GroupCreatedEvent.
|
||||||
|
* @param e The event
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::handleEvent(const GroupCreatedEvent & e) {
|
||||||
|
DEBUG("group created");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming GroupClosedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ApplicationLevelMulticastTestApplication::handleEvent(const GroupClosedEvent & e) {
|
||||||
|
DEBUG("group closed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* File: ApplicationLevelMulticastTestApplication.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on February 17, 2012, 5:02 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef APPLICATIONLEVELMULTICASTTESTAPPLICATION_H
|
||||||
|
#define APPLICATIONLEVELMULTICASTTESTAPPLICATION_H
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class Dispatcher;
|
||||||
|
class Moversight;
|
||||||
|
class Invitation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class ApplicationLevelMulticastTestApplication
|
||||||
|
* @brief Defines a small test application to test the stream transfer multicast service.
|
||||||
|
*
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @author Jan Gäbler
|
||||||
|
*/
|
||||||
|
class ApplicationLevelMulticastTestApplication : public Application {
|
||||||
|
public:
|
||||||
|
|
||||||
|
ApplicationLevelMulticastTestApplication(Moversight & m);
|
||||||
|
virtual ~ApplicationLevelMulticastTestApplication();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
void startTestCase(unsigned int i);
|
||||||
|
|
||||||
|
virtual void receiveStreamMessage(const StreamMessage & data, const PeerID sender);
|
||||||
|
|
||||||
|
// Event handling
|
||||||
|
virtual void handleEvent(const GroupCreatedEvent & e);
|
||||||
|
virtual void handleEvent(const GroupClosedEvent & e);
|
||||||
|
virtual void handleEvent(const JoinRequestEvent & e);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void testCase00();
|
||||||
|
void testCase01();
|
||||||
|
|
||||||
|
void invitePeer(TransportAddress & ta);
|
||||||
|
void sendData();
|
||||||
|
|
||||||
|
size_t waitCounter;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* APPLICATIONLEVELMULTICASTTESTAPPLICATION_H */
|
||||||
|
|
||||||
36
uni/masterarbeit/source/moversight/app/EventTypes.h
Normal file
36
uni/masterarbeit/source/moversight/app/EventTypes.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef EVENT_TYPES_H
|
||||||
|
#define EVENT_TYPES_H
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class EventTypes {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines for each moversight event an identifier.
|
||||||
|
*/
|
||||||
|
enum Event {
|
||||||
|
/**
|
||||||
|
* PEER_JOINED_EVENT
|
||||||
|
*/
|
||||||
|
PEER_JOINED_EVENT = 1,
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* PEER_IS_PENDING_EVENT
|
||||||
|
*/
|
||||||
|
PEER_IS_PENDING_EVENT,
|
||||||
|
PEER_RECONNECTED_EVENT,
|
||||||
|
PEER_LEFT_EVENT,
|
||||||
|
LOCAL_PEER_UPDATE_EVENT,
|
||||||
|
GROUP_CREATED_EVENT,
|
||||||
|
GROUP_CLOSED_EVENT,
|
||||||
|
EVENT_TYPES_COUNT // has to be last
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // EVENT_TYPES_H
|
||||||
594
uni/masterarbeit/source/moversight/app/MaintanceApplication.cc
Normal file
594
uni/masterarbeit/source/moversight/app/MaintanceApplication.cc
Normal file
@@ -0,0 +1,594 @@
|
|||||||
|
/*
|
||||||
|
* File: MaintanceApplication.cc
|
||||||
|
* Author: stubbfel
|
||||||
|
*
|
||||||
|
* Created on June 29, 2013
|
||||||
|
*/
|
||||||
|
#include "MaintanceApplication.h"
|
||||||
|
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
#include "Moversight.h"
|
||||||
|
#include "ms/Invitation.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "simutils/OmnetppIniUtils.h"
|
||||||
|
#include "mt/msg/GroupData.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "ms/events/GroupClosedEvent.h"
|
||||||
|
#include "ms/events/JoinRequestEvent.h"
|
||||||
|
#include "ms/events/LocalPeerUpdatedEvent.h"
|
||||||
|
#include "ms/events/PeerJoinedEvent.h"
|
||||||
|
#include "ms/events/PeerLeftEvent.h"
|
||||||
|
#include "mt/events/MulticastMessageDroppedEvent.h"
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#define DEBUG(msg) if (module.isPrintDebugAPP()) \
|
||||||
|
MOV_DEBUG << "APP@"<<(dis->getLocalState()==DISJOINED?"TA_":"");\
|
||||||
|
if(dis->getLocalState()==DISJOINED){MOV_DEBUG << module.getLocalAddress();}\
|
||||||
|
else{MOV_DEBUG<< dis->getMembershipService().getLocalID();}MOV_DEBUG<<" "<<msg<<std::endl;
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
const unsigned int MaintanceApplication::INITIAL_FAKEID;
|
||||||
|
const unsigned int MaintanceApplication::MS_TO_INT_FACTOR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param m A reference to the moversight instance
|
||||||
|
*/
|
||||||
|
MaintanceApplication::MaintanceApplication(Moversight & m) : Application(m, "MaintanceApplication"), RTTStat(m, "RTT") { /*, groupSizeStat(m, "groupSize"), groupSize(0) */
|
||||||
|
inGroup = false;
|
||||||
|
stopTest = false;
|
||||||
|
emptyCommandList = false;
|
||||||
|
nextCommand = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
MaintanceApplication::~MaintanceApplication() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MaintanceApplication::initialise() {
|
||||||
|
dis->subscribe<GroupClosedEvent>(this);
|
||||||
|
dis->subscribe<PeerJoinedEvent>(this);
|
||||||
|
dis->subscribe<PeerLeftEvent>(this);
|
||||||
|
dis->subscribe<LocalPeerUpdatedEvent>(this);
|
||||||
|
dis->subscribe<JoinRequestEvent>(this);
|
||||||
|
dis->subscribe<MulticastMessageDroppedEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MaintanceApplication::finalise() {
|
||||||
|
dis->unsubscribeAll(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the given test case.
|
||||||
|
* @param i The number of the test case to start.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::startTestCase(unsigned int i) {
|
||||||
|
if (stopTest) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
testCase00();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
testCase01();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
testCase02();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
testCase03();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
testCase04();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
testCase05();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
testCase06();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw NotImplementedYetException("not implemented");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}//End startTestCase
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@brief simple test run with random leaves and joins
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::testCase00() {
|
||||||
|
joinRate = 1;
|
||||||
|
leaveRate = 1;
|
||||||
|
defaultBehav();
|
||||||
|
}//End testCase00
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@brief simple test run coordinatet leaves and joins
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::testCase01() {
|
||||||
|
joinRate = 1; // == 100%
|
||||||
|
leaveRate = 2; // == 50%
|
||||||
|
commandsFileName = "commands/comt01.txt";
|
||||||
|
coordinateBehav();
|
||||||
|
module.scheduleTestCase(1);
|
||||||
|
}//End testCase01
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@brief testrun for simultaneously invataitons
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::testCase02() {
|
||||||
|
joinRate = 1; // == 100%
|
||||||
|
leaveRate = 1; // == 0%
|
||||||
|
defaultBehav2();
|
||||||
|
}//End testCase02
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@brief coordiante testrun, if all commands are executed then moduel==1 start to send groupdatas
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::testCase03() {
|
||||||
|
commandsFileName = "commands/com.txt";
|
||||||
|
coordinateBehav();
|
||||||
|
|
||||||
|
if (moduleIndex == 1 && dis->getLocalState() == JOINED) {
|
||||||
|
// abuse sendMessage for transmitting first sending time of the messages
|
||||||
|
sendKickMessage(createFakeID(GenericTime::currentTime().dbl() * MS_TO_INT_FACTOR));
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
module.scheduleTestCase(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@brief test run, for testing random forces role switch (module== ire sending RSA Messages)
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::testCase04() {
|
||||||
|
commandsFileName = "commands/comt04.txt";
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
coordinateBehav();
|
||||||
|
|
||||||
|
if (dis->getLocalState() == JOINED &&
|
||||||
|
commands.size() < 1 &&
|
||||||
|
moduleIndex == 1 &&
|
||||||
|
dis->getLocalSubState() != FLUSHING) {
|
||||||
|
PeerIDList masterIdList = dis->getMembershipService().getMasterPeerIDList();
|
||||||
|
PeerID switchMasterId = masterIdList.get(rand() % masterIdList.size());
|
||||||
|
dis->getMaintenanceRoleService().sendRSAMessage(switchMasterId);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.scheduleTestCase(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@brief uncoordiante testrun, moduel==1 send groupdatas
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::testCase05() {
|
||||||
|
joinRate = 5;
|
||||||
|
leaveRate = 100;
|
||||||
|
defaultBehav();
|
||||||
|
|
||||||
|
if (moduleIndex == 1 && dis->getLocalState() == JOINED) {
|
||||||
|
// abuse sendMessage for sending "useless" messages
|
||||||
|
sendKickMessage(createFakeID(0));
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
module.scheduleTestCase(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@brief coordiante testrun, if all commands are executed then moduel==1 start to send groupdatas (like testcase 3 but sending messages as a burst)
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::testCase06() {
|
||||||
|
commandsFileName = "commands/comt03.txt";
|
||||||
|
//module.scheduleTestCase(45);
|
||||||
|
coordinateBehav();
|
||||||
|
|
||||||
|
if (moduleIndex == 1 && dis->getLocalState() == JOINED && emptyCommandList) {
|
||||||
|
// send a the current time as fakeID
|
||||||
|
sendKickMessage(createFakeID(GenericTime::currentTime().dbl() * MS_TO_INT_FACTOR));
|
||||||
|
module.scheduleTestCase(0.001);
|
||||||
|
} else {
|
||||||
|
module.scheduleTestCase(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief excute the normal behaviour of the app, depends of the join- and
|
||||||
|
* leaverate, the module==1 will be insert peers. every Peer decided self,
|
||||||
|
* when they want to leave the group (Except module==1||2 )
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::defaultBehav() {
|
||||||
|
moduleIndex = module.getLocalAddress().getHostAddress().get4().getDByte(3);
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
candidates = OmnetppIniUtils::getDestinationAddressesFromOmnetppIni(module);
|
||||||
|
initApp = false;
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
if (moduleIndex == 1) { // starts counting at 1
|
||||||
|
//we have more candidates?
|
||||||
|
if (candidates.size() > 0) {
|
||||||
|
int join = rand() % joinRate;
|
||||||
|
|
||||||
|
if (join == 0) {
|
||||||
|
TransportAddress first = candidates.first();
|
||||||
|
candidates.remove(first);
|
||||||
|
invitePeer(first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//module.scheduleTestCase(45);
|
||||||
|
} else {
|
||||||
|
if (dis->getLocalState() == JOINED) {
|
||||||
|
inGroup = true;
|
||||||
|
} else {
|
||||||
|
inGroup = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inGroup && dis->getGroupSize() > 2) {
|
||||||
|
int leave = rand() % leaveRate;
|
||||||
|
|
||||||
|
if (leave == 1) {
|
||||||
|
leaveGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
//module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief excute the normal behaviour of the app, depends of the join- and
|
||||||
|
* leaverate, the module==1||2 will be insert peers. every Peer decided self,
|
||||||
|
* when they want to leave the group (Except module==1||2 )
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::defaultBehav2() {
|
||||||
|
moduleIndex = module.getLocalAddress().getHostAddress().get4().getDByte(3);
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
candidates = OmnetppIniUtils::getDestinationAddressesFromOmnetppIni(module);
|
||||||
|
initApp = false;
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
if (moduleIndex == 1) { // starts counting at 1
|
||||||
|
//we have more candidates?
|
||||||
|
if (candidates.size() > 0) {
|
||||||
|
int join = rand() % joinRate;
|
||||||
|
|
||||||
|
if (join == 0) {
|
||||||
|
TransportAddress first = candidates.first();
|
||||||
|
candidates.remove(first);
|
||||||
|
invitePeer(first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//module.scheduleTestCase(45);
|
||||||
|
} else if (moduleIndex == 2) { // starts counting at 2
|
||||||
|
if (dis->getLocalState() == JOINED) {
|
||||||
|
inGroup = true;
|
||||||
|
} else {
|
||||||
|
inGroup = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//we have more candidates?
|
||||||
|
if (candidates.size() > 0 && inGroup) {
|
||||||
|
int join = rand() % joinRate;
|
||||||
|
|
||||||
|
if (join == 0) {
|
||||||
|
TransportAddress last = candidates.get(candidates.size() - 1);
|
||||||
|
candidates.remove(last);
|
||||||
|
invitePeer(last);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//module.scheduleTestCase(45);
|
||||||
|
} else {
|
||||||
|
if (dis->getLocalState() == JOINED) {
|
||||||
|
inGroup = true;
|
||||||
|
} else {
|
||||||
|
inGroup = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inGroup && dis->getGroupSize() > 2) {
|
||||||
|
int leave = rand() % leaveRate;
|
||||||
|
|
||||||
|
if (leave == 1) {
|
||||||
|
leaveGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
//module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief excute the coordinated behaviour of the app, depends of the join- and
|
||||||
|
* leavecommands from a certean, the module==1 will be insert or remove peers
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::coordinateBehav() {
|
||||||
|
moduleIndex = module.getLocalAddress().getHostAddress().get4().getDByte(3);
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
candidates = OmnetppIniUtils::getDestinationAddressesFromOmnetppIni(module);
|
||||||
|
initApp = false;
|
||||||
|
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
std::ifstream commandFile(commandsFileName.c_str());
|
||||||
|
|
||||||
|
if (commandFile.is_open()) {
|
||||||
|
std::string command;
|
||||||
|
DEBUG("Load commands");
|
||||||
|
|
||||||
|
while (commandFile.good()) {
|
||||||
|
std::getline(commandFile, command);
|
||||||
|
DEBUG(command);
|
||||||
|
commands.add(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
commandFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
if (moduleIndex == 1) { // starts counting at 1
|
||||||
|
//we have more candidates?
|
||||||
|
if (commands.size() > 0 && nextCommand == true) {
|
||||||
|
std::string command = commands.first();
|
||||||
|
commands.pop();
|
||||||
|
DEBUG("exec command " << command);
|
||||||
|
|
||||||
|
switch (command[0]) {
|
||||||
|
case 'J':
|
||||||
|
nextCommand = false;
|
||||||
|
|
||||||
|
if (candidates.size() > 0) {
|
||||||
|
TransportAddress firstAddr = candidates.first();
|
||||||
|
invitePeer(firstAddr);
|
||||||
|
candidates.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'L': {
|
||||||
|
nextCommand = false;
|
||||||
|
PeerID kickPeerID;
|
||||||
|
|
||||||
|
if (command.size() == 3) {
|
||||||
|
size_t firstNumber = (size_t)(command[1] - '0');
|
||||||
|
size_t secondNumber = (size_t)(command[2] - '0');
|
||||||
|
kickPeerID = firstNumber * 10 + secondNumber;
|
||||||
|
} else {
|
||||||
|
kickPeerID = (PeerID)(command[1] - '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
sendKickMessage(kickPeerID);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (commands.size() == 0) {
|
||||||
|
emptyCommandList = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MaintanceApplication::sendKickMessage(PeerID pId) {
|
||||||
|
DEBUG("sendData - stream dummy data to the group");
|
||||||
|
GroupData data;
|
||||||
|
data.setData(peerIDToByte(pId));
|
||||||
|
dis->sendMessage(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief convert a PeerID to a ByteArray
|
||||||
|
* @param id which has to been convert
|
||||||
|
*/
|
||||||
|
ByteArray
|
||||||
|
MaintanceApplication::peerIDToByte(PeerID pId) {
|
||||||
|
ByteArray array;
|
||||||
|
array.push_back(pId.getValue() & 0xff);
|
||||||
|
array.push_back(pId.getValue() >> 8 & 0xff);
|
||||||
|
array.push_back(pId.getValue() >> 16 & 0xff);
|
||||||
|
array.push_back(pId.getValue() >> 24 & 0xff);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief convert a ByteArray to a PeerId
|
||||||
|
* @param array which has to been convert
|
||||||
|
*/
|
||||||
|
PeerID
|
||||||
|
MaintanceApplication::byteToPeerID(ByteArray array) {
|
||||||
|
unsigned int intPid = 0;
|
||||||
|
char* chPID = (char*) &intPid;
|
||||||
|
*chPID = array[0];
|
||||||
|
chPID++;
|
||||||
|
*chPID = array[1];
|
||||||
|
chPID++;
|
||||||
|
*chPID = array[2];
|
||||||
|
chPID++;
|
||||||
|
*chPID = array[3];
|
||||||
|
return PeerID(intPid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Invites a peer to a the moversight group.
|
||||||
|
* @param ta The transport address of the peer to invite.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::invitePeer(TransportAddress & ta) {
|
||||||
|
PeerDescription pDesc;
|
||||||
|
dis->invitePeer(ta, pDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Leaves the current group. The peer leafs the current group be
|
||||||
|
* emmiting a LeaveAnnounce within the current group.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::leaveGroup() {
|
||||||
|
dis->leaveGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinRequestEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::handleEvent(const JoinRequestEvent & e) {
|
||||||
|
PeerDescription desc;
|
||||||
|
PeerResources resource;
|
||||||
|
dis->acceptInvitation(e.getInvitation(), "accept invitation", desc, module.getPeerResources());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle PeerJoinedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::handleEvent(const PeerJoinedEvent & e) {
|
||||||
|
nextCommand = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PeerLeftEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::handleEvent(const PeerLeftEvent & e) {
|
||||||
|
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
if (!candidates.contains(e.getPeer().getLocalAddress())) {
|
||||||
|
candidates.add(e.getPeer().getLocalAddress());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nextCommand = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming LocalPeerUpdatedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::handleEvent(const LocalPeerUpdatedEvent & e) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "Peer-State - PID: " << e.getPeer().getPeerState();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming GroupClosedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::handleEvent(const GroupClosedEvent & e) {
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
stopTest = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief handler for incomming Group Data
|
||||||
|
* @param data, referennce of the new messages
|
||||||
|
* @param sender , id of the peer which sended this message
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::receiveGroupData(const GroupData & dat, const PeerID sender) {
|
||||||
|
ByteArray array = dat.getData();
|
||||||
|
PeerID pID = byteToPeerID(array);
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveStreamMessage - kick Peer" << pID;
|
||||||
|
//std::cerr << "buf " << buf << "\n";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
if (pID == dis->getLocalPeer().getPeerID()) {
|
||||||
|
leaveGroup();
|
||||||
|
}//End if
|
||||||
|
else if (pID > INITIAL_FAKEID) {
|
||||||
|
// is a fade id;
|
||||||
|
meassuringRTT(pID, dat);
|
||||||
|
}//end else if
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief method extract from a abuse peerId the sending item and calculate the rtt of a messages
|
||||||
|
* @param peerId, is a faked id. its the sendingtime + 1000
|
||||||
|
* @param dat, referennce of the message
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MaintanceApplication::meassuringRTT(PeerID peerId, const GroupData & dat) {
|
||||||
|
int sendTime = peerId.getValue() - INITIAL_FAKEID;
|
||||||
|
int reciveTime = GenericTime::currentTime().dbl() * MS_TO_INT_FACTOR;
|
||||||
|
int rtt = reciveTime - sendTime;
|
||||||
|
RTTStat.record(rtt);
|
||||||
|
MessageReference msgref = dat.getMessageReference();
|
||||||
|
DEBUG("rtt of msg " << msgref << " = " << rtt << "ms");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief methed create a fakepid
|
||||||
|
* @param value, parameter wich has to bo corvert to peerID
|
||||||
|
*/
|
||||||
|
PeerID
|
||||||
|
MaintanceApplication::createFakeID(unsigned int value) {
|
||||||
|
return PeerID(INITIAL_FAKEID + value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming MulticastMessageDroppedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void MaintanceApplication::handleEvent(const MulticastMessageDroppedEvent& e) {
|
||||||
|
const MulticastMessage & msg = e.getMessage();
|
||||||
|
DEBUG("message " << msg << "(MREF=" << msg.getMessageReference() << ") is dropped !!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* File: MaintanceApplication.h
|
||||||
|
* Author: stubbfel
|
||||||
|
*
|
||||||
|
* Created on June 29, 2013
|
||||||
|
*/
|
||||||
|
#ifndef MAINTANCEAPPLICATION_H
|
||||||
|
#define MAINTANCEAPPLICATION_H
|
||||||
|
|
||||||
|
#include "app/Application.h"
|
||||||
|
#include "StreamMessage.h"
|
||||||
|
#include "simutils/statistics/VectorStatisticRecorder.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class Dispatcher;
|
||||||
|
class Moversight;
|
||||||
|
class Invitation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class MaintanceApplication
|
||||||
|
* @brief test app for testing maintancement
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @author stubbfel
|
||||||
|
*/
|
||||||
|
class MaintanceApplication : public Application {
|
||||||
|
public:
|
||||||
|
MaintanceApplication(Moversight & m);
|
||||||
|
virtual ~MaintanceApplication();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
void startTestCase(unsigned int i);
|
||||||
|
|
||||||
|
void leaveGroup();
|
||||||
|
|
||||||
|
void receiveUnicastMessage(UnicastMessage & data, PeerID sender);
|
||||||
|
|
||||||
|
// Event handling
|
||||||
|
virtual void handleEvent(const JoinRequestEvent & e);
|
||||||
|
virtual void handleEvent(const PeerJoinedEvent & e);
|
||||||
|
virtual void handleEvent(const PeerLeftEvent & e);
|
||||||
|
virtual void handleEvent(const LocalPeerUpdatedEvent & e);
|
||||||
|
virtual void handleEvent(const GroupClosedEvent & e);
|
||||||
|
virtual void handleEvent(const MulticastMessageDroppedEvent & e);
|
||||||
|
|
||||||
|
void receiveGroupData(const GroupData & dat, const PeerID sender);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void testCase00();
|
||||||
|
void testCase01();
|
||||||
|
void testCase02();
|
||||||
|
void testCase03();
|
||||||
|
void testCase04();
|
||||||
|
void testCase05();
|
||||||
|
void testCase06();
|
||||||
|
void invitePeer(TransportAddress & ta);
|
||||||
|
void defaultBehav();
|
||||||
|
void defaultBehav2();
|
||||||
|
void coordinateBehav();
|
||||||
|
void sendKickMessage(PeerID pId);
|
||||||
|
PeerID createFakeID(unsigned int value);
|
||||||
|
|
||||||
|
ByteArray peerIDToByte(PeerID pId);
|
||||||
|
PeerID byteToPeerID(ByteArray array);
|
||||||
|
|
||||||
|
void meassuringRTT(PeerID peerId, const GroupData & dat);
|
||||||
|
|
||||||
|
int moduleIndex;
|
||||||
|
bool inGroup;
|
||||||
|
bool emptyCommandList;
|
||||||
|
int joinRate;
|
||||||
|
int leaveRate;
|
||||||
|
std::string commandsFileName;
|
||||||
|
bool stopTest;
|
||||||
|
bool nextCommand;
|
||||||
|
List<std::string> commands;
|
||||||
|
VectorStatisticRecorder RTTStat;
|
||||||
|
|
||||||
|
static const unsigned int INITIAL_FAKEID = 1000;
|
||||||
|
static const unsigned int MS_TO_INT_FACTOR = 1000;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* MAINTANCEAPPLICATION_H*/
|
||||||
|
|
||||||
342
uni/masterarbeit/source/moversight/app/MergeApplication.cc
Normal file
342
uni/masterarbeit/source/moversight/app/MergeApplication.cc
Normal file
@@ -0,0 +1,342 @@
|
|||||||
|
/*
|
||||||
|
* File: MergeApplication.h
|
||||||
|
* Author: sgaebler
|
||||||
|
*
|
||||||
|
* Created on July 8, 2011, 03:37 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "MergeApplication.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
#include "Moversight.h"
|
||||||
|
#include "app/Application.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "merge/events/MergeRequestEvent.h"
|
||||||
|
#include "merge/events/MergeDoneEvent.h"
|
||||||
|
#include "ms/Invitation.h"
|
||||||
|
#include "ms/PeerResources.h"
|
||||||
|
#include "mt/msg/GroupData.h"
|
||||||
|
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#define DEBUG(msg) if (module.isPrintDebugAPP()) \
|
||||||
|
MOV_DEBUG << "APP@"<<(dis->getLocalState()==DISJOINED?"TA_":"");\
|
||||||
|
if(dis->getLocalState()==DISJOINED){MOV_DEBUG << module.getLocalAddress();}\
|
||||||
|
else{MOV_DEBUG<< dis->getMembershipService().getLocalID();}MOV_DEBUG<<" "<<msg<<std::endl;
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief c'tor
|
||||||
|
* @param m The moversight module
|
||||||
|
*/
|
||||||
|
MergeApplication::MergeApplication(Moversight & m) : Application(m, "MergeApplication") {
|
||||||
|
WATCH(state);
|
||||||
|
mergeOnce = false;
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
mergeDuration.setName("mergeDuration");
|
||||||
|
mergeDuration.setUnit("s");
|
||||||
|
|
||||||
|
numberOfPeers = module.par("numberOfPeers");
|
||||||
|
clusterSize = numberOfPeers / module.getMaxPeerCount();
|
||||||
|
dt = 0.0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief d'tor
|
||||||
|
*/
|
||||||
|
MergeApplication::~MergeApplication() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MergeApplication::initialise() {
|
||||||
|
dis->subscribe<MergeDoneEvent>(this);
|
||||||
|
dis->subscribe<MergeRequestEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Invites a peer
|
||||||
|
* @param ta The address to invite
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::invitePeer(TransportAddress & ta) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitePeer - invite peer at address " << ta;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
PeerDescription pDesc;
|
||||||
|
dis->invitePeer(ta, pDesc);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Leaves the group
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::leaveGroup() {
|
||||||
|
|
||||||
|
DEBUG("leaveGroup - peer leave the group");
|
||||||
|
dis->leaveGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Try to merge with second group
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::mergeRequest(TransportAddress & ta) {
|
||||||
|
|
||||||
|
DEBUG("mergeRequest - group wants to merge with other group");
|
||||||
|
dis->mergeGroup(ta);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends dummy test data to the group
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::sendData() {
|
||||||
|
|
||||||
|
DEBUG("sendData - send 24 byte dummy data to the group");
|
||||||
|
GroupData data;
|
||||||
|
dis->sendMessage(data);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Tries to start the given test case.
|
||||||
|
* @param i The test case to start
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::startTestCase(unsigned int i) {
|
||||||
|
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
testCase00();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
testCase01();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
testCase02();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}//End switch
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case 0: Master-master
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::testCase00() {
|
||||||
|
|
||||||
|
state = dis->getLocalState();
|
||||||
|
|
||||||
|
// init app
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
|
||||||
|
//set up group for each peer
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) < (numberOfPeers / 2 + 1)) {
|
||||||
|
createRoster(1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
createRoster(2);
|
||||||
|
}
|
||||||
|
initApp = false;
|
||||||
|
|
||||||
|
dt = simTime();
|
||||||
|
}
|
||||||
|
// 1 is master
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) == 1) {
|
||||||
|
if (dis->getLocalState() == JOINED) {
|
||||||
|
if (!mergeOnce) {
|
||||||
|
mergeOnce = true;
|
||||||
|
// defining the otherMergeDirector - here Master!
|
||||||
|
TransportAddress ta = getNewTransportAddress(numberOfPeers / 2 + 1);
|
||||||
|
ta.setPort(module.getLocalAddress().getPort());
|
||||||
|
mergeRequest(ta);
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case 1: master-slave
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::testCase01() {
|
||||||
|
state = dis->getLocalState();
|
||||||
|
|
||||||
|
// init app
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
|
||||||
|
//set up group for each peer
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) < (numberOfPeers / 2 + 1)) {
|
||||||
|
createRoster(1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
createRoster(2);
|
||||||
|
}
|
||||||
|
initApp = false;
|
||||||
|
|
||||||
|
dt = simTime();
|
||||||
|
}
|
||||||
|
// 1 is master
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) == 1) {
|
||||||
|
if (dis->getLocalState() == JOINED) {
|
||||||
|
if (!mergeOnce) {
|
||||||
|
mergeOnce = true;
|
||||||
|
// defining the otherMergeDirector - here Slave!
|
||||||
|
TransportAddress ta = getNewTransportAddress(numberOfPeers / 2 + 2);
|
||||||
|
ta.setPort(module.getLocalAddress().getPort());
|
||||||
|
mergeRequest(ta);
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case 2: slave - slave
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::testCase02() {
|
||||||
|
state = dis->getLocalState();
|
||||||
|
|
||||||
|
// init app
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
|
||||||
|
//set up group for each peer
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) < (numberOfPeers / 2 + 1)) {
|
||||||
|
createRoster(1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
createRoster(2);
|
||||||
|
}
|
||||||
|
initApp = false;
|
||||||
|
|
||||||
|
dt = simTime();
|
||||||
|
}
|
||||||
|
// 2 is slave
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) == 2) {
|
||||||
|
if (dis->getLocalState() == JOINED) {
|
||||||
|
if (!mergeOnce) {
|
||||||
|
mergeOnce = true;
|
||||||
|
// defining the otherMergeDirector - here Slave!
|
||||||
|
TransportAddress ta = getNewTransportAddress(numberOfPeers / 2 + 2);
|
||||||
|
ta.setPort(module.getLocalAddress().getPort());
|
||||||
|
mergeRequest(ta);
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creating a new TransportAddress depending on the given parameter i.
|
||||||
|
* @param i - stands for the 3rd bytePosition
|
||||||
|
* @return the created ta
|
||||||
|
*/
|
||||||
|
TransportAddress
|
||||||
|
MergeApplication::getNewTransportAddress(int i) {
|
||||||
|
std::stringstream taStream;
|
||||||
|
taStream << "192.168.0." << i;
|
||||||
|
std::string s(taStream.str());
|
||||||
|
return TransportAddress(IPvXAddress(s.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MergeApplication::receiveGroupData(const GroupData & data, const PeerID sender) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveGroupData - receive group data from peer ID " << sender;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a new roster for the given group
|
||||||
|
* @param rosterNumber - if first or second roster to create
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::createRoster(int rosterNumber) {
|
||||||
|
|
||||||
|
Roster roster;
|
||||||
|
roster.setNextPeerID(numberOfPeers / 2 + 1);
|
||||||
|
roster.setViewID(numberOfPeers / 2 + 1);
|
||||||
|
|
||||||
|
PeerDescription dummyPDesc;
|
||||||
|
PeerResources dummyPRes;
|
||||||
|
ClusterID cID = 0;
|
||||||
|
if (clusterSize <= 1) {
|
||||||
|
|
||||||
|
// necessary to make sure if the numberOfPeers is equal or smaller than
|
||||||
|
// the maxPeerCount that only one cluster is created!
|
||||||
|
roster.setViewID(numberOfPeers + 1);
|
||||||
|
roster.setNextPeerID(numberOfPeers + 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
if (rosterNumber == 1) {
|
||||||
|
|
||||||
|
for (int i = 1; i <= numberOfPeers / 2; i++) {
|
||||||
|
TransportAddress ta = getNewTransportAddress(i);
|
||||||
|
ta.setPort(module.getLocalAddress().getPort());
|
||||||
|
MemberDescription mDesc(i, ta, JOINED, cID, dummyPDesc, dummyPRes);
|
||||||
|
roster.addMemberDescription(mDesc);
|
||||||
|
|
||||||
|
if ((i % module.getMaxPeerCount()) == 0) {
|
||||||
|
cID++;
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
}
|
||||||
|
dis->setupGroupFromRoster(roster, module.getLocalAddress().getHostAddress().get4().getDByte(3));
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (int i = (numberOfPeers / 2 + 1); i <= numberOfPeers; i++) {
|
||||||
|
|
||||||
|
TransportAddress ta = getNewTransportAddress(i);
|
||||||
|
ta.setPort(module.getLocalAddress().getPort());
|
||||||
|
MemberDescription mDesc(i - (numberOfPeers / 2), ta, JOINED, cID, dummyPDesc, dummyPRes);
|
||||||
|
roster.addMemberDescription(mDesc);
|
||||||
|
|
||||||
|
if ((i % module.getMaxPeerCount()) == 0) {
|
||||||
|
cID++;
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
}
|
||||||
|
dis->setupGroupFromRoster(roster, module.getLocalAddress().getHostAddress().get4().getDByte(3) - numberOfPeers / 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming MergeRequestEvent
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::handleEvent(const MergeRequestEvent & e) {
|
||||||
|
dis->acceptGroupMerge();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming MergeDoneEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MergeApplication::handleEvent(const MergeDoneEvent & e) {
|
||||||
|
#if OMNETPP
|
||||||
|
mergeDuration.recordWithTimestamp(simTime() - dt, numberOfPeers);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}//End namespace moversight
|
||||||
|
}//End namespace ubeeme
|
||||||
|
|
||||||
71
uni/masterarbeit/source/moversight/app/MergeApplication.h
Normal file
71
uni/masterarbeit/source/moversight/app/MergeApplication.h
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* File: MergeApplication.h
|
||||||
|
* Author: sgaebler
|
||||||
|
*
|
||||||
|
* Created on July 8, 2011, 03:37 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MERGEAPPLICATION_H
|
||||||
|
#define MERGEAPPLICATION_H
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "ms/PeerState.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class Dispatcher;
|
||||||
|
class Moversight;
|
||||||
|
class Invitation;
|
||||||
|
|
||||||
|
class MergeApplication : public Application {
|
||||||
|
public:
|
||||||
|
|
||||||
|
MergeApplication(Moversight & m);
|
||||||
|
virtual ~MergeApplication();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
|
||||||
|
void startTestCase(unsigned int i);
|
||||||
|
|
||||||
|
void receiveGroupData(const GroupData & data, const PeerID sender);
|
||||||
|
|
||||||
|
// Event handling
|
||||||
|
virtual void handleEvent(const MergeRequestEvent & e);
|
||||||
|
virtual void handleEvent(const MergeDoneEvent & e);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void testCase00();
|
||||||
|
void testCase01();
|
||||||
|
void testCase02();
|
||||||
|
|
||||||
|
void invitePeer(TransportAddress & ta);
|
||||||
|
void leaveGroup();
|
||||||
|
void sendData();
|
||||||
|
void mergeRequest(TransportAddress & ta);
|
||||||
|
void mergeGroup();
|
||||||
|
void createRoster(int rosterNumber);
|
||||||
|
void createRoster2();
|
||||||
|
TransportAddress getNewTransportAddress(int i);
|
||||||
|
|
||||||
|
State state;
|
||||||
|
|
||||||
|
bool mergeOnce;
|
||||||
|
|
||||||
|
int waitCounter;
|
||||||
|
|
||||||
|
int mergeCase;
|
||||||
|
|
||||||
|
cOutVector mergeDuration;
|
||||||
|
simtime_t dt;
|
||||||
|
int numberOfPeers;
|
||||||
|
int clusterSize;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* MERGEAPPLICATION_H */
|
||||||
|
|
||||||
242
uni/masterarbeit/source/moversight/app/NFDTestApplication.cc
Normal file
242
uni/masterarbeit/source/moversight/app/NFDTestApplication.cc
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
/*
|
||||||
|
* File: NFDTestApplication.cc
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on April 20, 2011, 11:32 AM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "NFDTestApplication.h"
|
||||||
|
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
#include "Moversight.h"
|
||||||
|
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "mt/msg/GroupData.h"
|
||||||
|
#include "ms/Invitation.h"
|
||||||
|
|
||||||
|
#include "ms/events/PeerJoinedEvent.h"
|
||||||
|
#include "fd/events/PeerReconnectedEvent.h"
|
||||||
|
#include "ms/events/LocalPeerUpdatedEvent.h"
|
||||||
|
#include "ms/events/JoinRequestEvent.h"
|
||||||
|
#include "ms/events/JoinConfirmEvent.h"
|
||||||
|
#include "ms/events/JoinRejectedEvent.h"
|
||||||
|
#include "ms/events/JoinAbortedEvent.h"
|
||||||
|
#include "mt/events/PendingPeersEvent.h"
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#define DEBUG(msg) if (module.isPrintDebugAPP()) \
|
||||||
|
MOV_DEBUG << "APP@"<<(dis->getLocalState()==DISJOINED?"TA_":"");\
|
||||||
|
if(dis->getLocalState()==DISJOINED){MOV_DEBUG << module.getLocalAddress();}\
|
||||||
|
else{MOV_DEBUG<< dis->getMembershipService().getLocalID();}MOV_DEBUG<<" "<<msg<<std::endl;
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param m The moversight module
|
||||||
|
*/
|
||||||
|
NFDTestApplication::NFDTestApplication(Moversight & m) : Application(m, "NFDTestApplication") {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
NFDTestApplication::~NFDTestApplication() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
NFDTestApplication::initialise() {
|
||||||
|
dis->subscribe<PeerReconnectedEvent>(this);
|
||||||
|
dis->subscribe<PendingPeersEvent>(this);
|
||||||
|
dis->subscribe<JoinRequestEvent>(this);
|
||||||
|
dis->subscribe<JoinConfirmEvent>(this);
|
||||||
|
dis->subscribe<JoinRejectedEvent>(this);
|
||||||
|
dis->subscribe<PeerJoinedEvent>(this);
|
||||||
|
dis->subscribe<JoinAbortedEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
NFDTestApplication::finalise() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Invites a peer to a the moversight group.
|
||||||
|
* @param ta The transport address of the peer to invite.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::invitePeer(TransportAddress & ta) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitePeer - invite peer at address " << ta;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
PeerDescription pDesc;
|
||||||
|
dis->invitePeer(ta, pDesc);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Leaves the current group. The peer leafs the current group be
|
||||||
|
* emitting a LeaveAnnounce within the current group.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::leaveGroup() {
|
||||||
|
|
||||||
|
DEBUG("leaveGroup - peer leave the group");
|
||||||
|
dis->leaveGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends dummy data to the group to simulate application traffic.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::sendData() {
|
||||||
|
|
||||||
|
DEBUG("sendData - send 24 byte dummy data to the group");
|
||||||
|
GroupData data;
|
||||||
|
dis->sendMessage(data);
|
||||||
|
|
||||||
|
}//End
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the given test case.
|
||||||
|
* @param i The number of the test case to start.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::startTestCase(unsigned int i) {
|
||||||
|
|
||||||
|
}//End startTestCase
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Callback method. This method is called by moversight to signal that the local peer have receive a group data message.
|
||||||
|
* @param dat The received group data.
|
||||||
|
* @param sender The sending peer ID.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::receiveGroupData(GroupData & dat, PeerID sender) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveGroupData - receive group data from peer ID " << sender;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinRequestEvent
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The local instance has received an invitation.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::handleEvent(const JoinRequestEvent & e) {
|
||||||
|
DEBUG("invitationReceived - invitation received");
|
||||||
|
std::stringstream buf;
|
||||||
|
|
||||||
|
buf << "invitationReceived - invitationID: " << e.getInvitation().getInvitationID() << " inviterID: " << e.getInvitation().getInviterID();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
// if(module.localAddress() == 1 || module.localAddress() == 3 ){
|
||||||
|
//
|
||||||
|
// MOV_DEBUG << "APP_invitationReceived@TA_" << module.localAddress() << " reject invitation" << endl;
|
||||||
|
// gc->rejectInvitaion(invitation, "peer placing strategy not supported");
|
||||||
|
//
|
||||||
|
// }//End if
|
||||||
|
// else{
|
||||||
|
|
||||||
|
DEBUG("invitationReceived - accept invitation");
|
||||||
|
PeerDescription pDesc;
|
||||||
|
PeerResources resources;
|
||||||
|
|
||||||
|
dis->acceptInvitation(e.getInvitation(), "accept invitation", pDesc, resources);
|
||||||
|
|
||||||
|
|
||||||
|
// }//End else
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinConfirmEvent
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The remote peer has accepted the invitation from the local peer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::handleEvent(const JoinConfirmEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveInvitationResponse - peer at TA: " << e.getInvitation().getInviteeAddress() << " accept invitation " << e.getInvitation().getInvitationID();
|
||||||
|
buf << " message: " << e.getMessage() << ", peer description: " << e.getDescription().getDescription();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinRejectedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The remote peer has rejected the invitation from the local peer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::handleEvent(const JoinRejectedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveInvitationResponse - peer at TA: " << e.getInvitation().getInviteeAddress() << " reject invitation " << e.getInvitation().getInvitationID();
|
||||||
|
buf << " reason: " << e.getReason();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinAbortedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The invitation process was aborted.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::handleEvent(const JoinAbortedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationAborted - invitation to peer " << e.getTransportAddress() << " aborted";
|
||||||
|
buf << " reason: " << e.getReason();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PeerJoinedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::handleEvent(const PeerJoinedEvent & e) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerJoined - peer " << e.getPeerID()
|
||||||
|
<< "@TA_" << e.getTransportAddress() << " joined group successfully ("
|
||||||
|
<< e.getDescription().getDescription() << ")";
|
||||||
|
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PendingPeersEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* Some peers are pending.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::handleEvent(const PendingPeersEvent & e) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerIsPending - The following peers are pending: " << e.getPeerIDList();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PeerReconnectedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* A peer has reconnected.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
NFDTestApplication::handleEvent(const PeerReconnectedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerReconnected - peer " << e.getPeerID() << " has reconnected";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
58
uni/masterarbeit/source/moversight/app/NFDTestApplication.h
Normal file
58
uni/masterarbeit/source/moversight/app/NFDTestApplication.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* File: NFDTestApplication.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on April 20, 2011, 11:32 AM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NFDTESTAPPLICATION_H
|
||||||
|
#define NFDTESTAPPLICATION_H
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "ms/PeerState.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class Dispatcher;
|
||||||
|
class Moversight;
|
||||||
|
|
||||||
|
class NFDTestApplication : public Application {
|
||||||
|
public:
|
||||||
|
|
||||||
|
NFDTestApplication(Moversight & m);
|
||||||
|
|
||||||
|
virtual ~NFDTestApplication();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
void startTestCase(unsigned int i);
|
||||||
|
|
||||||
|
void receiveGroupData(GroupData & data, PeerID sender);
|
||||||
|
|
||||||
|
// Event handling
|
||||||
|
virtual void handleEvent(const PeerJoinedEvent & e);
|
||||||
|
virtual void handleEvent(const PeerReconnectedEvent & e);
|
||||||
|
virtual void handleEvent(const PendingPeersEvent & e);
|
||||||
|
virtual void handleEvent(const JoinRequestEvent & e);
|
||||||
|
virtual void handleEvent(const JoinConfirmEvent & e);
|
||||||
|
virtual void handleEvent(const JoinRejectedEvent & e);
|
||||||
|
virtual void handleEvent(const JoinAbortedEvent & e);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void invitePeer(TransportAddress & ta);
|
||||||
|
void leaveGroup();
|
||||||
|
void sendData();
|
||||||
|
|
||||||
|
PeerState state;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* NFDTESTAPPLICATION_H */
|
||||||
|
|
||||||
411
uni/masterarbeit/source/moversight/app/PartitionApplication.cc
Normal file
411
uni/masterarbeit/source/moversight/app/PartitionApplication.cc
Normal file
@@ -0,0 +1,411 @@
|
|||||||
|
/*
|
||||||
|
* File: PartitionApplication.cc
|
||||||
|
* Author: gschneid
|
||||||
|
*
|
||||||
|
* Created on October 22, 2012, 11:09 AM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PartitionApplication.h"
|
||||||
|
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
#include "Moversight.h"
|
||||||
|
#include "ms/PeerResources.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "mt/msg/GroupData.h"
|
||||||
|
#include "ms/Invitation.h"
|
||||||
|
#include "simutils/OmnetppIniUtils.h"
|
||||||
|
#include "StreamMessage.h"
|
||||||
|
|
||||||
|
#include "ms/events/GroupCreatedEvent.h"
|
||||||
|
#include "ms/events/GroupClosedEvent.h"
|
||||||
|
#include "ms/events/PeerJoinedEvent.h"
|
||||||
|
#include "ms/events/JoinRequestEvent.h"
|
||||||
|
#include "ms/events/JoinConfirmEvent.h"
|
||||||
|
#include "ms/events/JoinRejectedEvent.h"
|
||||||
|
#include "ms/events/JoinAbortedEvent.h"
|
||||||
|
#include "ms/events/RejoinDoneEvent.h"
|
||||||
|
#include "ms/events/RejoinFailedEvent.h"
|
||||||
|
#include "mt/events/PendingPeersEvent.h"
|
||||||
|
#include "ms/events/LocalPeerUpdatedEvent.h"
|
||||||
|
#include "ms/events/PeerLeftEvent.h"
|
||||||
|
#include "simutils/events/StartMeasuringEvent.h"
|
||||||
|
#include "simutils/events/StopMeasuringEvent.h"
|
||||||
|
#include "fd/events/PeerReconnectedEvent.h"
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#define DEBUG(msg) if (module.isPrintDebugAPP()) \
|
||||||
|
MOV_DEBUG << "APP@"<<(dis->getLocalState()==DISJOINED?"TA_":"");\
|
||||||
|
if(dis->getLocalState()==DISJOINED){MOV_DEBUG << module.getLocalAddress();}\
|
||||||
|
else{MOV_DEBUG<< dis->getMembershipService().getLocalID();}MOV_DEBUG<<" "<<msg<<std::endl;
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param m A reference to the moversight instance
|
||||||
|
*/
|
||||||
|
PartitionApplication::PartitionApplication(Moversight & m) : Application(m, "PartitionApplication"), rejoinSucessDuration(m, "rejoinSuccess"), leaveDelay(m, "leaveDelay"), groupSize(0) {
|
||||||
|
|
||||||
|
numberOfPeers = module.par("numberOfPeers");
|
||||||
|
numberOfMobilePeers = module.par("numberOfMobilePeers");
|
||||||
|
|
||||||
|
clusterSize = (numberOfPeers + numberOfMobilePeers) / module.getMaxPeerCount();
|
||||||
|
|
||||||
|
if ((numberOfPeers + numberOfMobilePeers) % module.getMaxPeerCount() != 0) {
|
||||||
|
clusterSize++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
PartitionApplication::~PartitionApplication() {
|
||||||
|
// joinDelayStat, leaveDelayStat, dtDelayStat,groupSizeStat removen?!
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PartitionApplication::initialise() {
|
||||||
|
dis->subscribe<GroupCreatedEvent>(this);
|
||||||
|
dis->subscribe<PeerJoinedEvent>(this);
|
||||||
|
dis->subscribe<PendingPeersEvent>(this);
|
||||||
|
dis->subscribe<PeerReconnectedEvent>(this);
|
||||||
|
dis->subscribe<PeerLeftEvent>(this);
|
||||||
|
|
||||||
|
dis->subscribe<JoinRequestEvent>(this);
|
||||||
|
dis->subscribe<JoinConfirmEvent>(this);
|
||||||
|
dis->subscribe<JoinRejectedEvent>(this);
|
||||||
|
dis->subscribe<JoinAbortedEvent>(this);
|
||||||
|
|
||||||
|
dis->subscribe<RejoinDoneEvent>(this);
|
||||||
|
dis->subscribe<RejoinFailedEvent>(this);
|
||||||
|
|
||||||
|
// MeasurementEvent
|
||||||
|
dis->subscribe<StartMeasuringEvent>(this);
|
||||||
|
dis->subscribe<StopMeasuringEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PartitionApplication::finalise() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Invites a peer to a the moversight group.
|
||||||
|
* @param ta The transport address of the peer to invite.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::invitePeer(TransportAddress & ta) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitePeer - invite peer at address " << ta;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
PeerDescription pDesc;
|
||||||
|
dis->invitePeer(ta, pDesc);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Leaves the current group. The peer leafs the current group be
|
||||||
|
* emitting a LeaveAnnounce within the current group.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::leaveGroup() {
|
||||||
|
DEBUG("leaveGroup - peer leave the group");
|
||||||
|
dis->leaveGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends dummy data to the group to simulate application traffic.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::sendData() {
|
||||||
|
DEBUG("sendData - send 24 byte dummy data to the group");
|
||||||
|
GroupData data;
|
||||||
|
VectorStatistic vs("sendGroupData");
|
||||||
|
vs.record(GenericTime::currentTime());
|
||||||
|
dis->sendMessage(data);
|
||||||
|
}//End
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the given test case.
|
||||||
|
* @param i The number of the test case to start.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::startTestCase(unsigned int i) {
|
||||||
|
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
testCase00();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}//End switch
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Executes test case 01 - 6 peers, testcase1
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::testCase00() {
|
||||||
|
DEBUG("partitionApplication tc00");
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
createRoster();
|
||||||
|
initApp = false;
|
||||||
|
module.scheduleTestCase(80);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Method to create a roster from which the group is set up.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::createRoster() {
|
||||||
|
int numberOfAllPeers = numberOfPeers + numberOfMobilePeers;
|
||||||
|
Roster roster;
|
||||||
|
roster.setNextPeerID(numberOfAllPeers + 1);
|
||||||
|
roster.setViewID(numberOfAllPeers + 1);
|
||||||
|
|
||||||
|
PeerDescription dummyPDesc;
|
||||||
|
PeerResources dummyPRes;
|
||||||
|
ClusterID cID = 0;
|
||||||
|
if (clusterSize <= 1) {
|
||||||
|
|
||||||
|
// necessary to make sure if the numberOfPeers is equal or smaller than
|
||||||
|
// the maxPeerCount that only one cluster is created!
|
||||||
|
roster.setViewID(numberOfAllPeers + 1);
|
||||||
|
roster.setNextPeerID(numberOfAllPeers + 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
for (int i = 1; i <= numberOfAllPeers; i++) {
|
||||||
|
TransportAddress ta = getNewTransportAddress(i);
|
||||||
|
ta.setPort(module.getLocalAddress().getPort());
|
||||||
|
MemberDescription mDesc(i, ta, JOINED, cID, dummyPDesc, dummyPRes);
|
||||||
|
roster.addMemberDescription(mDesc);
|
||||||
|
|
||||||
|
if ((i % module.getMaxPeerCount()) == 0) {
|
||||||
|
cID++;
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
|
||||||
|
dis->setupGroupFromRoster(roster, module.getLocalAddress().getHostAddress().get4().getDByte(3));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Getting a transportAddress for a given index.
|
||||||
|
* @param i The index of the peer a TA is searched for.
|
||||||
|
* @return The created TA.
|
||||||
|
*/
|
||||||
|
TransportAddress
|
||||||
|
PartitionApplication::getNewTransportAddress(int i) {
|
||||||
|
std::stringstream taStream;
|
||||||
|
taStream << "192.168.0." << i;
|
||||||
|
std::string s(taStream.str());
|
||||||
|
return TransportAddress(IPvXAddress(s.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Callback method. This method is called by moversight to signal that the local peer have receive a group data message.
|
||||||
|
* @param dat The received group data.
|
||||||
|
* @param sender The sending peer ID.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::receiveGroupData(const GroupData & dat, const PeerID sender) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveGroupData - receive group data from peer ID " << sender;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
VectorStatistic vs("receiveGroupData");
|
||||||
|
vs.record(GenericTime::currentTime());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinRequestEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The local instance has received an invitation.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const JoinRequestEvent & e) {
|
||||||
|
|
||||||
|
DEBUG("invitationReceived - invitation received");
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationReceived - invitationID: " << e.getInvitation().getInvitationID() << " inviterID: " << e.getInvitation().getInviterID();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
DEBUG("invitationReceived - accept invitation");
|
||||||
|
PeerDescription pDesc;
|
||||||
|
PeerResources resources;
|
||||||
|
dis->acceptInvitation(e.getInvitation(), "accept invitation", pDesc, resources);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JonConfirmEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The remote peer has accepted the invitation from the local peer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const JoinConfirmEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveInvitationResponse - peer at TA: " << e.getInvitation().getInviteeAddress() << " accept invitation " << e.getInvitation().getInvitationID();
|
||||||
|
buf << " message: " << e.getMessage() << ", peer description: " << e.getDescription().getDescription();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinRejectedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The invitation process was aborted.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const JoinRejectedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationAborted - invitation ID " << e.getInvitation().getInvitationID() << " aborted";
|
||||||
|
buf << " reason: " << e.getReason();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinAbortedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The invitation process could not be executed.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const JoinAbortedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationAborted - invitation to peer " << e.getTransportAddress() << " aborted";
|
||||||
|
buf << " reason: " << e.getReason();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming GroupCreatedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const GroupCreatedEvent & e) {
|
||||||
|
groupSize = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const PeerJoinedEvent & e) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerJoined - peer " << e.getPeerID()
|
||||||
|
<< "@TA_" << e.getTransportAddress() << " joined group successfully ("
|
||||||
|
<< e.getDescription().getDescription() << ")";
|
||||||
|
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PendingPeersEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* Some peers are pending.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const PendingPeersEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerIsPending - peer " << e.getPeerIDList() << " is pending";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PeerReconnectedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* A pending peers has reconnected.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const PeerReconnectedEvent & e) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerReconnected - peer " << e.getPeerID() << " has reconnected";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PeerLeftEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* A dedicated peer has left the group.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const PeerLeftEvent & e) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerLeft - peer " << e.getPeer().getPeerID() << "@TA_" << e.getPeer().getLocalAddress() << " left the group";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming RejoinDoneEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const RejoinDoneEvent & e) {
|
||||||
|
dis->signal(new StopMeasuringEvent("REJOIN"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming RejoinFailedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const RejoinFailedEvent & e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming StartMeasuringEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* Starts the measuring of the given parameter.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const StartMeasuringEvent & e) {
|
||||||
|
std::string startS = "start" + e.getMeasurement();
|
||||||
|
VectorStatistic vs(startS.c_str());
|
||||||
|
if (e.getMeasurement() == "REJOIN") {
|
||||||
|
vs.record(GenericTime::currentTime());
|
||||||
|
rejoinSucessDuration.startRecord();
|
||||||
|
}
|
||||||
|
if (e.getMeasurement() == "TG") {
|
||||||
|
vs.record(GenericTime::currentTime());
|
||||||
|
// leaveDelay.startRecord();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming StopMeasuringEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* Stops the measuring of the given parameter.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PartitionApplication::handleEvent(const StopMeasuringEvent & e) {
|
||||||
|
std::string startS = "stop " + e.getMeasurement();
|
||||||
|
VectorStatistic vs(startS.c_str());
|
||||||
|
if (e.getMeasurement() == "REJOIN") {
|
||||||
|
vs.record(GenericTime::currentTime());
|
||||||
|
rejoinSucessDuration.startRecord();
|
||||||
|
}
|
||||||
|
if (e.getMeasurement() == "TG") {
|
||||||
|
vs.record(GenericTime::currentTime());
|
||||||
|
leaveDelay.stopRecord();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}//End namespace moversight
|
||||||
|
}//End namespace ubeeme
|
||||||
|
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* File: PartitionApplication.h
|
||||||
|
* Author: gschneid
|
||||||
|
*
|
||||||
|
* Created on October 22, 2012, 11:09 AM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef PARTITIONAPPLICATION_H
|
||||||
|
#define PARTITIONAPPLICATION_H
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
#include "simutils/statistics/DurationStatisticRecorder.h"
|
||||||
|
#include "simutils/statistics/VectorStatisticRecorder.h"
|
||||||
|
#include "common/container/PeerIDList.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class Dispatcher;
|
||||||
|
class Moversight;
|
||||||
|
class Invitation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class PartitionApplication
|
||||||
|
* @brief Defines a small test application to test the moversight protocol.
|
||||||
|
*
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @author Jan Gäbler
|
||||||
|
*/
|
||||||
|
class PartitionApplication : public Application {
|
||||||
|
public:
|
||||||
|
|
||||||
|
PartitionApplication(Moversight & m);
|
||||||
|
virtual ~PartitionApplication();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
void startTestCase(unsigned int i);
|
||||||
|
|
||||||
|
void receiveGroupData(const GroupData & data, const PeerID sender);
|
||||||
|
|
||||||
|
// Event handling
|
||||||
|
virtual void handleEvent(const GroupCreatedEvent & e);
|
||||||
|
|
||||||
|
virtual void handleEvent(const JoinRequestEvent & e);
|
||||||
|
virtual void handleEvent(const JoinConfirmEvent & e);
|
||||||
|
virtual void handleEvent(const JoinRejectedEvent & e);
|
||||||
|
virtual void handleEvent(const JoinAbortedEvent & e);
|
||||||
|
|
||||||
|
|
||||||
|
virtual void handleEvent(const PeerJoinedEvent & e);
|
||||||
|
virtual void handleEvent(const PendingPeersEvent & e);
|
||||||
|
virtual void handleEvent(const PeerReconnectedEvent & e);
|
||||||
|
virtual void handleEvent(const PeerLeftEvent & e);
|
||||||
|
|
||||||
|
virtual void handleEvent(const RejoinDoneEvent & e);
|
||||||
|
virtual void handleEvent(const RejoinFailedEvent & e);
|
||||||
|
|
||||||
|
virtual void handleEvent(const StartMeasuringEvent & e);
|
||||||
|
virtual void handleEvent(const StopMeasuringEvent & e);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void testCase00();
|
||||||
|
|
||||||
|
void invitePeer(TransportAddress & ta);
|
||||||
|
void leaveGroup();
|
||||||
|
void sendData();
|
||||||
|
|
||||||
|
void createRoster();
|
||||||
|
TransportAddress getNewTransportAddress(int i);
|
||||||
|
|
||||||
|
void setPendings(PeerIDList & pIdList);
|
||||||
|
|
||||||
|
DurationStatisticRecorder rejoinSucessDuration;
|
||||||
|
DurationStatisticRecorder leaveDelay;
|
||||||
|
|
||||||
|
size_t waitCounter;
|
||||||
|
size_t groupSize;
|
||||||
|
size_t lastGroupSize;
|
||||||
|
|
||||||
|
int numberOfPeers;
|
||||||
|
int clusterSize;
|
||||||
|
int numberOfMobilePeers;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* PARTITIONAPPLICATION_H */
|
||||||
|
|
||||||
86
uni/masterarbeit/source/moversight/app/PeerDescription.cc
Normal file
86
uni/masterarbeit/source/moversight/app/PeerDescription.cc
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* File: PeerDescription.cc
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on July 23, 2013, 4:00 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PeerDescription.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Output operator
|
||||||
|
* @param s The stream to output
|
||||||
|
* @param pDesc The description to add to the output.
|
||||||
|
* @return The resulting output stream.
|
||||||
|
*/
|
||||||
|
std::ostream & operator<<(std::ostream & s, const PeerDescription & pDesc) {
|
||||||
|
s << pDesc.getDescription();
|
||||||
|
return s;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Default Constructor
|
||||||
|
*/
|
||||||
|
PeerDescription::PeerDescription() : desc("dummy@moversight.org") {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor. Creates a new instance using the given string as description for the peer.
|
||||||
|
* @param d The string to use as peer description.
|
||||||
|
*/
|
||||||
|
PeerDescription::PeerDescription(const std::string & d) : desc(d) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy constructor
|
||||||
|
* @param other The instance to copy
|
||||||
|
*/
|
||||||
|
PeerDescription::PeerDescription(const PeerDescription & other) {
|
||||||
|
operator=(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
PeerDescription::~PeerDescription() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns a description of the given peer as string representation
|
||||||
|
* @returns A textual representation of the current peer description.
|
||||||
|
*/
|
||||||
|
std::string
|
||||||
|
PeerDescription::getDescription() const {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Serialization method
|
||||||
|
* @param archive the source and destination respectively of the serialization process.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerDescription::set(Archive & archive) {
|
||||||
|
archive(desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assignment operator
|
||||||
|
* @param other The instance to assign
|
||||||
|
* @return A reference to the local object
|
||||||
|
*/
|
||||||
|
PeerDescription &
|
||||||
|
PeerDescription::operator=(const PeerDescription & other) {
|
||||||
|
|
||||||
|
if (this != &other) {
|
||||||
|
desc = other.desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
52
uni/masterarbeit/source/moversight/app/PeerDescription.h
Normal file
52
uni/masterarbeit/source/moversight/app/PeerDescription.h
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
/*
|
||||||
|
* File: PeerDescription.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on September 28, 2010, 3:45 PM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef PEERDESCRIPTION_H
|
||||||
|
#define PEERDESCRIPTION_H
|
||||||
|
|
||||||
|
#include "../core/serialization/serializable.h"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class PeerDescription
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @brief Provides a meta object which describe a peer within the moversight system, as the real name of a peer or this XMPP address.
|
||||||
|
*/
|
||||||
|
class PeerDescription : public Serializable {
|
||||||
|
public:
|
||||||
|
|
||||||
|
PeerDescription();
|
||||||
|
PeerDescription(const std::string & d);
|
||||||
|
PeerDescription(const PeerDescription & other);
|
||||||
|
virtual ~PeerDescription();
|
||||||
|
|
||||||
|
std::string getDescription() const;
|
||||||
|
|
||||||
|
virtual void set(Archive & archive);
|
||||||
|
|
||||||
|
PeerDescription & operator=(const PeerDescription & other);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The description of the peer, represented as string.
|
||||||
|
*/
|
||||||
|
std::string desc;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
std::ostream & operator<<(std::ostream & s, const PeerDescription & pDesc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* PEERDESCRIPTION_H */
|
||||||
366
uni/masterarbeit/source/moversight/app/PeerplacingApplication.cc
Normal file
366
uni/masterarbeit/source/moversight/app/PeerplacingApplication.cc
Normal file
@@ -0,0 +1,366 @@
|
|||||||
|
/*
|
||||||
|
* PeerplacingApplication.cc
|
||||||
|
*
|
||||||
|
* Created on: Apr 26, 2011
|
||||||
|
* Author: gschneid
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PeerplacingApplication.h"
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
#include "../Dispatcher.h"
|
||||||
|
#include "../Moversight.h"
|
||||||
|
#include "../common/transport/TransportAddress.h"
|
||||||
|
#include "../mt/msg/GroupData.h"
|
||||||
|
#include "../ms/Invitation.h"
|
||||||
|
|
||||||
|
#include "ms/events/JoinRequestEvent.h"
|
||||||
|
#include "ms/events/JoinConfirmEvent.h"
|
||||||
|
#include "ms/events/JoinRejectedEvent.h"
|
||||||
|
#include "ms/events/JoinAbortedEvent.h"
|
||||||
|
#include "ms/events/PeerJoinedEvent.h"
|
||||||
|
#include "ms/events/PeerLeftEvent.h"
|
||||||
|
#include "mt/events/PendingPeersEvent.h"
|
||||||
|
#include "fd/events/PeerReconnectedEvent.h"
|
||||||
|
#include "ms/events/PeerJoinedEvent.h"
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#define DEBUG(msg) if (module.isPrintDebugAPP()) \
|
||||||
|
MOV_DEBUG << "APP@"<<(dis->getLocalState()==DISJOINED?"TA_":"");\
|
||||||
|
if(dis->getLocalState()==DISJOINED){MOV_DEBUG << module.getLocalAddress();}\
|
||||||
|
else{MOV_DEBUG<< dis->getMembershipService().getLocalID();}MOV_DEBUG<<" "<<msg<<std::endl;
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param m A reference to the moversight instance
|
||||||
|
*/
|
||||||
|
PeerplacingApplication::PeerplacingApplication(Moversight & m) : Application(m, "PeerPlacingApplication") {
|
||||||
|
WATCH(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
PeerplacingApplication::~PeerplacingApplication() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PeerplacingApplication::initialise() {
|
||||||
|
dis->subscribe<PeerJoinedEvent>(this);
|
||||||
|
dis->subscribe<JoinRequestEvent>(this);
|
||||||
|
dis->subscribe<JoinConfirmEvent>(this);
|
||||||
|
dis->subscribe<JoinRejectedEvent>(this);
|
||||||
|
dis->subscribe<JoinAbortedEvent>(this);
|
||||||
|
dis->subscribe<PendingPeersEvent>(this);
|
||||||
|
dis->subscribe<PeerReconnectedEvent>(this);
|
||||||
|
dis->subscribe<PeerLeftEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PeerplacingApplication::finalise() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Invites a peer to a the moversight group.
|
||||||
|
* @param ta The transport address of the peer to invite.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::invitePeer(TransportAddress & ta) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitePeer - invite peer at address " << ta;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
PeerDescription pDesc;
|
||||||
|
dis->invitePeer(ta, pDesc);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Leaves the current group. The peer leafs the current group be
|
||||||
|
& emmiting a LeaveAnnounce within the current group.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::leaveGroup() {
|
||||||
|
|
||||||
|
DEBUG("leaveGroup - peer leave the group");
|
||||||
|
dis->leaveGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends dummy data to the group to simulate application traffic.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::sendData() {
|
||||||
|
|
||||||
|
DEBUG("sendData - send 24 byte dummy data to the group");
|
||||||
|
GroupData data;
|
||||||
|
dis->sendMessage(data);
|
||||||
|
|
||||||
|
}//End
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starst the given test case.
|
||||||
|
* @param i The number of the test case to start.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::startTestCase(unsigned int i) {
|
||||||
|
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
testCase00();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
testCase01();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
testCase02();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}//End switch
|
||||||
|
}//End startTestCase
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Executes test case 00
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::testCase00() {
|
||||||
|
// state = dis->getLocalState();
|
||||||
|
// int moduleIndex = module.getLocalAddress().getHostAddress();
|
||||||
|
// if (initApp) {
|
||||||
|
//
|
||||||
|
// const char *candidateString = module.par("candidates");
|
||||||
|
// cStringTokenizer tokenizer(candidateString);
|
||||||
|
// while (tokenizer.hasMoreTokens()) {
|
||||||
|
// candidates.add(atoi(tokenizer.nextToken()));
|
||||||
|
// }//End while
|
||||||
|
// waitCounter = 5;
|
||||||
|
// initApp = false;
|
||||||
|
// count = 1;
|
||||||
|
//
|
||||||
|
// if (moduleIndex == 0) {
|
||||||
|
// count = 0;
|
||||||
|
// module.scheduleTestCase(45);
|
||||||
|
// }//End if
|
||||||
|
// }//End if
|
||||||
|
//
|
||||||
|
// //------------------------------------------------------------------
|
||||||
|
// //run the app
|
||||||
|
// //------------------------------------------------------------------
|
||||||
|
// if (moduleIndex == 0) {
|
||||||
|
// //do we have more candidates?
|
||||||
|
//
|
||||||
|
// if (waitCounter > 0) {
|
||||||
|
// waitCounter--;
|
||||||
|
// module.scheduleTestCase(45);
|
||||||
|
// }
|
||||||
|
// if (candidatesIndex < candidates.size()) {
|
||||||
|
// invitePeer(candidates.get(candidatesIndex++));
|
||||||
|
// if (candidatesIndex == candidates.size()) {
|
||||||
|
// module.scheduleTestCase(240);
|
||||||
|
// waitCounter = 50;
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// module.scheduleTestCase(45);
|
||||||
|
// }
|
||||||
|
// count = 1;
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// //Only leave if all the others are in their cluster
|
||||||
|
// if (waitCounter > 0) {
|
||||||
|
// waitCounter--;
|
||||||
|
// module.scheduleTestCase(90);
|
||||||
|
// }
|
||||||
|
// // else{
|
||||||
|
// // leaveGroup();
|
||||||
|
// // initApp = true;
|
||||||
|
// // module.scheduleTestCase(45);
|
||||||
|
// // waitCounter = 8;
|
||||||
|
// // }
|
||||||
|
// }//End else
|
||||||
|
// }//End if
|
||||||
|
// else if (moduleIndex > 0) {
|
||||||
|
// if (count == 1 && moduleIndex == 5) {
|
||||||
|
// waitCounter = 60;
|
||||||
|
// module.scheduleTestCase(250);
|
||||||
|
// count = 0;
|
||||||
|
// }
|
||||||
|
// else if (count == 1 && moduleIndex != 1) {
|
||||||
|
// waitCounter = (moduleIndex - 1) * 8;
|
||||||
|
// module.scheduleTestCase((moduleIndex - 1)*45);
|
||||||
|
// count = 0;
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// if (waitCounter > 0) {
|
||||||
|
// waitCounter--;
|
||||||
|
// module.scheduleTestCase(45);
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// //do we have more candidates?
|
||||||
|
// if (candidatesIndex < candidates.size()) {
|
||||||
|
// invitePeer(candidates.get(candidatesIndex++));
|
||||||
|
// count = 0;
|
||||||
|
// module.scheduleTestCase(45);
|
||||||
|
// if (module.getLocalAddress().getHostAddress() == 5) {
|
||||||
|
// waitCounter = 15;
|
||||||
|
// }
|
||||||
|
// }//End if
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Executes test case 01.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::testCase01() {
|
||||||
|
throw NotImplementedYetException("run test case 01 not implemented ");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Executes test case 02.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::testCase02() {
|
||||||
|
throw NotImplementedYetException("run test case 02 not implemented ");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Callback method. This method is called by moversight to signal that the local peer have receive a group data message.
|
||||||
|
* @param dat The received group data.
|
||||||
|
* @param sender The sending peer ID.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::receiveGroupData(const GroupData & data, const PeerID sender) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveGroupData - receive group data from peer ID " << sender;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinRequestEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The local instance has received an invitation.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::handleEvent(const JoinRequestEvent & e) {
|
||||||
|
|
||||||
|
DEBUG("invitationReceived - invitation received");
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationReceived - invitationID: " << e.getInvitation().getInvitationID() << " inviterID: " << e.getInvitation().getInviterID();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
DEBUG("invitationReceived - accept invitation");
|
||||||
|
PeerDescription pDesc;
|
||||||
|
PeerResources resources;
|
||||||
|
dis->acceptInvitation(e.getInvitation(), "accept invitation", pDesc, resources);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinConfirmEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The remote peer has accepted the invitation from the local peer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::handleEvent(const JoinConfirmEvent & e) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveInvitationResponse - peer at TA: " << e.getInvitation().getInviteeAddress() << " accept invitation " << e.getInvitation().getInvitationID();
|
||||||
|
buf << " message: " << e.getMessage() << ", peer description: " << e.getDescription().getDescription();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinRejectedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The invitation was rejected by the remote peer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::handleEvent(const JoinRejectedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationAborted - invitation ID " << e.getInvitation().getInvitationID() << " aborted";
|
||||||
|
buf << " reason: " << e.getReason();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinAbortedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* The invitation process could not be executed.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::handleEvent(const JoinAbortedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationAborted - invitation to peer " << e.getTransportAddress() << " aborted";
|
||||||
|
buf << " reason: " << e.getReason();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PeerJoinedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* A peer has joined the group.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::handleEvent(const PeerJoinedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerJoined - peer " << e.getPeerID() << "@TA_" << e.getTransportAddress() << " joined group successfully (" << e.getDescription().getDescription() << ")";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PendingPeersEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* A list of peers is pending.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::handleEvent(const PendingPeersEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerIsPending - peer " << e.getPeerIDList() << " is pending";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PeerReconnectedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* A pending peer has reconnected.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::handleEvent(const PeerReconnectedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerReconnected - peer " << e.getPeerID() << " is reconnected";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming PeerLeftEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*
|
||||||
|
* A dedicated peer has left the group.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
PeerplacingApplication::handleEvent(const PeerLeftEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerLeft - peer " << e.getPeer().getPeerID() << "@TA_" << e.getPeer().getLocalAddress() << " left the group";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
}//End namespace moversight
|
||||||
|
}//End namespace ubeeme
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* PeerplacingApplication.h
|
||||||
|
*
|
||||||
|
* Created on: Apr 26, 2011
|
||||||
|
* Author: gschneid
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PEERPLACINGAPPLICATION_H_
|
||||||
|
#define PEERPLACINGAPPLICATION_H_
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "ms/PeerState.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class Dispatcher;
|
||||||
|
class Moversight;
|
||||||
|
class Invitation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a small test application to test the moversight protocoll.
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class TestApplication
|
||||||
|
* @author Grit Schneider
|
||||||
|
*/
|
||||||
|
class PeerplacingApplication : public Application {
|
||||||
|
public:
|
||||||
|
|
||||||
|
PeerplacingApplication(Moversight & m);
|
||||||
|
virtual ~PeerplacingApplication();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
void startTestCase(unsigned int i);
|
||||||
|
|
||||||
|
void receiveGroupData(const GroupData & data, const PeerID sender);
|
||||||
|
|
||||||
|
// Event handling
|
||||||
|
virtual void handleEvent(const JoinRequestEvent & e);
|
||||||
|
virtual void handleEvent(const JoinConfirmEvent & e);
|
||||||
|
virtual void handleEvent(const JoinRejectedEvent & e);
|
||||||
|
virtual void handleEvent(const JoinAbortedEvent & e);
|
||||||
|
virtual void handleEvent(const PeerJoinedEvent & e);
|
||||||
|
virtual void handleEvent(const PendingPeersEvent & e);
|
||||||
|
virtual void handleEvent(const PeerReconnectedEvent & e);
|
||||||
|
virtual void handleEvent(const PeerLeftEvent & e);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void testCase00();
|
||||||
|
void testCase01();
|
||||||
|
void testCase02();
|
||||||
|
|
||||||
|
void invitePeer(TransportAddress & ta);
|
||||||
|
void leaveGroup();
|
||||||
|
void sendData();
|
||||||
|
|
||||||
|
PeerState state;
|
||||||
|
|
||||||
|
int waitCounter;
|
||||||
|
int count;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* PEERPLACINGAPPLICATION_H_ */
|
||||||
|
|
||||||
200
uni/masterarbeit/source/moversight/app/PendingTestApplication.cc
Normal file
200
uni/masterarbeit/source/moversight/app/PendingTestApplication.cc
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
/*
|
||||||
|
* File: PendingTestApplication.cc
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on February 19, 2013, 5:01 PM
|
||||||
|
*/
|
||||||
|
#include "PendingTestApplication.h"
|
||||||
|
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
#include "Moversight.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "mt/msg/GroupData.h"
|
||||||
|
#include "ms/Invitation.h"
|
||||||
|
#include "simutils/OmnetppIniUtils.h"
|
||||||
|
|
||||||
|
#include "ms/events/PeerLeftEvent.h"
|
||||||
|
#include "fd/events/PeerReconnectedEvent.h"
|
||||||
|
#include "mt/events/PendingPeersEvent.h"
|
||||||
|
#include "ms/events/JoinRequestEvent.h"
|
||||||
|
#include "ms/events/JoinConfirmEvent.h"
|
||||||
|
#include "ms/events/JoinRejectedEvent.h"
|
||||||
|
#include "ms/events/JoinAbortedEvent.h"
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#define DEBUG(msg) if (module.isPrintDebugAPP()) \
|
||||||
|
MOV_DEBUG << "APP@"<<(dis->getLocalState()==DISJOINED?"TA_":"");\
|
||||||
|
if(dis->getLocalState()==DISJOINED){MOV_DEBUG << module.getLocalAddress();}\
|
||||||
|
else{MOV_DEBUG<< dis->getMembershipService().getLocalID();}MOV_DEBUG<<" "<<msg<<std::endl;
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
PendingTestApplication::PendingTestApplication(Moversight & m) : Application(m, "PendingTestApplication") {
|
||||||
|
}
|
||||||
|
|
||||||
|
PendingTestApplication::~PendingTestApplication() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::initialise() {
|
||||||
|
dis->subscribe<PeerLeftEvent>(this);
|
||||||
|
dis->subscribe<PeerReconnectedEvent>(this);
|
||||||
|
dis->subscribe<PendingPeersEvent>(this);
|
||||||
|
dis->subscribe<JoinRequestEvent>(this);
|
||||||
|
dis->subscribe<JoinConfirmEvent>(this);
|
||||||
|
dis->subscribe<JoinAbortedEvent>(this);
|
||||||
|
dis->subscribe<JoinRejectedEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::finalise() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::startTestCase(unsigned int i) {
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
testCase00();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}//End switch
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::receiveGroupData(const GroupData & data, const PeerID sender) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveGroupData - receive group data from peer ID " << sender;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::testCase00() {
|
||||||
|
int moduleIndex = module.getLocalAddress().getHostAddress().get4().getDByte(3);
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
|
||||||
|
candidates = OmnetppIniUtils::getDestinationAddressesFromOmnetppIni(module);
|
||||||
|
|
||||||
|
initApp = false;
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
if (moduleIndex == 1) { // starts counting at 1
|
||||||
|
|
||||||
|
//we have more candidates?
|
||||||
|
if (candidates.size() > 0) {
|
||||||
|
invitePeer(candidates.first());
|
||||||
|
candidates.pop();
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sendData();
|
||||||
|
}
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::invitePeer(TransportAddress & ta) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitePeer - invite peer at address " << ta;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
PeerDescription pDesc;
|
||||||
|
;
|
||||||
|
dis->invitePeer(ta, pDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::leaveGroup() {
|
||||||
|
DEBUG("leaveGroup - peer leave the group");
|
||||||
|
dis->leaveGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::sendData() {
|
||||||
|
|
||||||
|
DEBUG("sendData - send 24 byte dummy data to the group");
|
||||||
|
GroupData data;
|
||||||
|
dis->sendMessage(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::handleEvent(const JoinRequestEvent & e) {
|
||||||
|
|
||||||
|
DEBUG("JoinRequest - invitation received");
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "JoinRequest - invitationID: " << e.getInvitation().getInvitationID() << " inviterID: " << e.getInvitation().getInviterID();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
DEBUG("JoinRequest - accept invitation");
|
||||||
|
PeerDescription pDesc;
|
||||||
|
PeerResources resources;
|
||||||
|
|
||||||
|
dis->acceptInvitation(e.getInvitation(), "accept invitation", pDesc, resources);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::handleEvent(const JoinConfirmEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "JoinConfirm - peer at TA: " << e.getInvitation().getInviteeAddress() << " accept invitation " << e.getInvitation().getInvitationID();
|
||||||
|
buf << " message: " << e.getMessage() << ", peer description: " << e.getDescription().getDescription();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::handleEvent(const JoinRejectedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "JoinRejected - invitation ID " << e.getInvitation().getInvitationID() << " aborted";
|
||||||
|
buf << " reason: " << e.getReason();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::handleEvent(const JoinAbortedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "JoinNotExecutable - invitation to peer " << e.getTransportAddress() << " aborted";
|
||||||
|
buf << " reason: " << e.getReason();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::handleEvent(const PendingPeersEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "PendingPeers - peers " << e.getPeerIDList() << " are pending";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::handleEvent(const PeerReconnectedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "PeerReconnect - peer " << e.getPeerID() << " is reconnected";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PendingTestApplication::handleEvent(const PeerLeftEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "PeerLeft - peer " << e.getPeer().getPeerID() << "@TA_" << e.getPeer().getLocalAddress() << " left the group";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* File: PendingTestApplication.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on February 19, 2013, 5:01 PM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef PENDINGTESTAPPLICATION_H
|
||||||
|
#define PENDINGTESTAPPLICATION_H
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class Dispatcher;
|
||||||
|
class Moversight;
|
||||||
|
class Invitation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class PendingTestApplication
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @brief An test application to test the protocol services related to
|
||||||
|
* pending peer issues.
|
||||||
|
* @ingroup Moversight
|
||||||
|
*/
|
||||||
|
class PendingTestApplication : public Application {
|
||||||
|
public:
|
||||||
|
|
||||||
|
PendingTestApplication(Moversight & m);
|
||||||
|
virtual ~PendingTestApplication();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
void startTestCase(unsigned int inv);
|
||||||
|
|
||||||
|
void receiveGroupData(const GroupData & data, const PeerID sender);
|
||||||
|
|
||||||
|
// Event handling
|
||||||
|
virtual void handleEvent(const JoinRequestEvent & e);
|
||||||
|
virtual void handleEvent(const JoinConfirmEvent & e);
|
||||||
|
virtual void handleEvent(const JoinRejectedEvent & e);
|
||||||
|
virtual void handleEvent(const JoinAbortedEvent & e);
|
||||||
|
virtual void handleEvent(const PendingPeersEvent & e);
|
||||||
|
virtual void handleEvent(const PeerReconnectedEvent & e);
|
||||||
|
virtual void handleEvent(const PeerLeftEvent & e);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void testCase00();
|
||||||
|
|
||||||
|
void invitePeer(TransportAddress & ta);
|
||||||
|
void leaveGroup();
|
||||||
|
void sendData();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* PENDINGTESTAPPLICATION_H */
|
||||||
|
|
||||||
688
uni/masterarbeit/source/moversight/app/SplitApplication.cc
Normal file
688
uni/masterarbeit/source/moversight/app/SplitApplication.cc
Normal file
@@ -0,0 +1,688 @@
|
|||||||
|
/*
|
||||||
|
* File: SplitApplication.h
|
||||||
|
* Author: sgaebler
|
||||||
|
*
|
||||||
|
* Created on April 12, 2011, 04:37 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SplitApplication.h"
|
||||||
|
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
#include "Moversight.h"
|
||||||
|
#include "app/Application.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "merge/events/MergeRequestEvent.h"
|
||||||
|
#include "ms/Invitation.h"
|
||||||
|
#include "ms/PeerResources.h"
|
||||||
|
#include "ms/events/PeerJoinedEvent.h"
|
||||||
|
#include "ms/events/JoinConfirmEvent.h"
|
||||||
|
#include "ms/events/JoinRequestEvent.h"
|
||||||
|
#include "ms/events/JoinRejectedEvent.h"
|
||||||
|
#include "ms/events/JoinAbortedEvent.h"
|
||||||
|
#include "ms/events/PeerLeftEvent.h"
|
||||||
|
#include "mt/msg/GroupData.h"
|
||||||
|
#include "mt/events/PendingPeersEvent.h"
|
||||||
|
#include "fd/events/PeerReconnectedEvent.h"
|
||||||
|
#include "simutils/statistics/DurationStatisticRecorder.h"
|
||||||
|
#include "simutils/OmnetppIniUtils.h"
|
||||||
|
#include "split/events/SplitDoneEvent.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#define DEBUG(msg) if (module.isPrintDebugAPP()) \
|
||||||
|
MOV_DEBUG << "APP@"<<(dis->getLocalState()==DISJOINED?"TA_":"");\
|
||||||
|
if(dis->getLocalState()==DISJOINED){MOV_DEBUG << module.getLocalAddress();}\
|
||||||
|
else{MOV_DEBUG<< dis->getMembershipService().getLocalID();}MOV_DEBUG<<" "<<msg<<std::endl;
|
||||||
|
|
||||||
|
//defines a test options parameter
|
||||||
|
//Bitlesrichtung-->
|
||||||
|
//bit 0: semantic flag
|
||||||
|
//bit 1: flush flag
|
||||||
|
//bit 2: reply flag
|
||||||
|
//bit 3-7: leer
|
||||||
|
#define TEST_OPTIONS 20 //0b00100000
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief constructor
|
||||||
|
* @param m The moversight module
|
||||||
|
*/
|
||||||
|
SplitApplication::SplitApplication(Moversight & m) : Application(m, "SplitApplication"), joinDelayStat(m, "joinDelay") {
|
||||||
|
WATCH(state);
|
||||||
|
splitOnce = false;
|
||||||
|
|
||||||
|
splitDuration.setName("splitDuration");
|
||||||
|
splitDuration.setUnit("s");
|
||||||
|
|
||||||
|
numberOfPeers = module.par("numberOfPeers");
|
||||||
|
numberOfClusters = numberOfPeers / module.getMaxPeerCount();
|
||||||
|
|
||||||
|
dt = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief destructor
|
||||||
|
*/
|
||||||
|
SplitApplication::~SplitApplication() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SplitApplication::initialise() {
|
||||||
|
dis->subscribe<PeerJoinedEvent>(this);
|
||||||
|
dis->subscribe<JoinConfirmEvent>(this);
|
||||||
|
dis->subscribe<JoinRequestEvent>(this);
|
||||||
|
dis->subscribe<JoinRejectedEvent>(this);
|
||||||
|
dis->subscribe<JoinAbortedEvent>(this);
|
||||||
|
dis->subscribe<PeerLeftEvent>(this);
|
||||||
|
dis->subscribe<PeerReconnectedEvent>(this);
|
||||||
|
dis->subscribe<SplitDoneEvent>(this);
|
||||||
|
dis->subscribe<MergeRequestEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SplitApplication::finalise() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Invites a peer
|
||||||
|
* @param ta The address to invite
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::invitePeer(TransportAddress & ta) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitePeer - invite peer at address " << ta;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
PeerDescription pDesc;
|
||||||
|
dis->invitePeer(ta, pDesc);
|
||||||
|
joinDelayStat.startRecord();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Leaves the group
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::leaveGroup() {
|
||||||
|
|
||||||
|
DEBUG("leaveGroup - peer leave the group");
|
||||||
|
dis->leaveGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sends dummy test data to the group
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::sendData() {
|
||||||
|
|
||||||
|
DEBUG("sendData - send 24 byte dummy data to the group");
|
||||||
|
GroupData data;
|
||||||
|
dis->sendMessage(data);
|
||||||
|
|
||||||
|
}//End
|
||||||
|
|
||||||
|
void
|
||||||
|
SplitApplication::splitGroup(unsigned char options, PeerIDList splitPeers) {
|
||||||
|
|
||||||
|
DEBUG("splitPeers - the group is splitting");
|
||||||
|
dis->splitGroup(options, splitPeers);
|
||||||
|
|
||||||
|
VectorStatistic vs("splitGroup");
|
||||||
|
vs.record(GenericTime::currentTime());
|
||||||
|
|
||||||
|
}//End
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Tries to start the given test case.
|
||||||
|
* @param i The test case to start
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::startTestCase(unsigned int i) {
|
||||||
|
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
testCase00();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
testCase01();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
testCase02();
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
testCase03();
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
testCase04();
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
testCase05(); // bis hier splitcases abgedeckt
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
testCase06();
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
testCase07();
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
testCase08();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}//End switch
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case 0: complete Cluster
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::testCase00() {
|
||||||
|
|
||||||
|
// init app
|
||||||
|
if (initApp) {
|
||||||
|
createRoster(numberOfPeers + 1, numberOfClusters);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) == 1) {
|
||||||
|
if (dis->getMembershipService().getLocalState() == JOINED) {
|
||||||
|
if (!splitOnce) {
|
||||||
|
splitOnce = true;
|
||||||
|
|
||||||
|
PeerList peerList = dis->getMembershipService().getPeerList();
|
||||||
|
PeerIDList pIdList;
|
||||||
|
for (size_t i = 0; i < peerList.size(); i++) {
|
||||||
|
if (peerList.get(i).getClusterID() == 0) {
|
||||||
|
pIdList.add(peerList.get(i).getPeerID());
|
||||||
|
}//End if
|
||||||
|
}//end for
|
||||||
|
|
||||||
|
splitGroup(TEST_OPTIONS, pIdList); //SPLITreq
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case1: whole masters
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::testCase01() {
|
||||||
|
|
||||||
|
// init app
|
||||||
|
if (initApp) {
|
||||||
|
createRoster(numberOfPeers + 1, numberOfClusters);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//----------------------------------
|
||||||
|
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) == 1) {
|
||||||
|
if (dis->getMembershipService().getLocalState() == JOINED) {
|
||||||
|
if (!splitOnce) {
|
||||||
|
splitOnce = true;
|
||||||
|
PeerIDList pidl;
|
||||||
|
pidl.add(dis->getMembershipService().getMasterPeerIDList());
|
||||||
|
|
||||||
|
splitGroup(TEST_OPTIONS, pidl); //SPLITreq
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case2: <50% of slaves
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::testCase02() {
|
||||||
|
|
||||||
|
// init app
|
||||||
|
if (initApp) {
|
||||||
|
createRoster(numberOfPeers + 1, numberOfClusters);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//----------------------------------
|
||||||
|
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) == 1) {
|
||||||
|
if (dis->getMembershipService().getLocalState() == JOINED) {
|
||||||
|
if (!splitOnce) {
|
||||||
|
splitOnce = true;
|
||||||
|
PeerIDList pidl;
|
||||||
|
int numberOfSlavesToAdd = (numberOfPeers - numberOfClusters) / 2 - 1;
|
||||||
|
PeerIDList peersToAdd = getSpecifiedNumberOfPeers(false, numberOfSlavesToAdd, numberOfClusters);
|
||||||
|
pidl.add(peersToAdd);
|
||||||
|
|
||||||
|
splitGroup(TEST_OPTIONS, pidl); //SPLITreq
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case3: >= 50% of slaves
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::testCase03() {
|
||||||
|
|
||||||
|
// init app
|
||||||
|
if (initApp) {
|
||||||
|
createRoster(numberOfPeers + 1, numberOfClusters);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//----------------------------------
|
||||||
|
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) == 1) {
|
||||||
|
if (dis->getMembershipService().getLocalState() == JOINED) {
|
||||||
|
if (!splitOnce) {
|
||||||
|
splitOnce = true;
|
||||||
|
PeerIDList pidl;
|
||||||
|
int numberOfSlavesToAdd = (numberOfPeers - numberOfClusters) / 2;
|
||||||
|
PeerIDList peersToAdd = getSpecifiedNumberOfPeers(false, numberOfSlavesToAdd, numberOfClusters);
|
||||||
|
pidl.add(peersToAdd);
|
||||||
|
|
||||||
|
splitGroup(TEST_OPTIONS, pidl); //SPLITreq
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case4: <50% mixed
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::testCase04() {
|
||||||
|
|
||||||
|
// init app
|
||||||
|
if (initApp) {
|
||||||
|
createRoster(numberOfPeers + 1, numberOfClusters);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//----------------------------------
|
||||||
|
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) == 1) {
|
||||||
|
if (dis->getMembershipService().getLocalState() == JOINED) {
|
||||||
|
if (!splitOnce) {
|
||||||
|
splitOnce = true;
|
||||||
|
PeerIDList pidl;
|
||||||
|
int numberOfSlavesToAdd = numberOfPeers / 2 - 1;
|
||||||
|
PeerIDList peersToAdd = getSpecifiedNumberOfPeers(true, numberOfSlavesToAdd, numberOfClusters);
|
||||||
|
pidl.add(peersToAdd);
|
||||||
|
|
||||||
|
splitGroup(TEST_OPTIONS, pidl); //SPLITreq
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case5: >= 50% mixed
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::testCase05() {
|
||||||
|
|
||||||
|
// init app
|
||||||
|
if (initApp) {
|
||||||
|
createRoster(numberOfPeers + 1, numberOfClusters);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
//run the app
|
||||||
|
//----------------------------------
|
||||||
|
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) == 1) {
|
||||||
|
if (dis->getMembershipService().getLocalState() == JOINED) {
|
||||||
|
if (!splitOnce) {
|
||||||
|
splitOnce = true;
|
||||||
|
PeerIDList pidl;
|
||||||
|
int numberOfSlavesToAdd = numberOfPeers / 2;
|
||||||
|
PeerIDList peersToAdd = getSpecifiedNumberOfPeers(true, numberOfSlavesToAdd, numberOfClusters);
|
||||||
|
pidl.add(peersToAdd);
|
||||||
|
|
||||||
|
splitGroup(TEST_OPTIONS, pidl); //SPLITreq
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case 6: 6 peers cs 6 (Join - split)
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::testCase06() {
|
||||||
|
int moduleIndex = module.getLocalAddress().getHostAddress().get4().getDByte(3);
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
candidates = OmnetppIniUtils::getDestinationAddressesFromOmnetppIni(module);
|
||||||
|
waitCounter = 5;
|
||||||
|
initApp = false;
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
//we have more candidates?
|
||||||
|
if (candidates.size() > 0) {
|
||||||
|
if (waitCounter > 0) {
|
||||||
|
waitCounter--;
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
if (candidatesIndex < candidates.size()) {
|
||||||
|
invitePeer(candidates.get(candidatesIndex++));
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (dis->getMembershipService().getLocalState() == JOINED) {
|
||||||
|
if (!splitOnce) {
|
||||||
|
splitOnce = true;
|
||||||
|
PeerIDList pidl;
|
||||||
|
int numberOfSlavesToAdd = 3;
|
||||||
|
PeerIDList peersToAdd = getSpecifiedNumberOfPeers(true, numberOfSlavesToAdd, 1);
|
||||||
|
pidl.add(peersToAdd);
|
||||||
|
splitGroup(TEST_OPTIONS, pidl); //SPLITreq
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case 7: 24 peers cs 6 (Join - split)
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::testCase07() {
|
||||||
|
int moduleIndex = module.getLocalAddress().getHostAddress().get4().getDByte(3);
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
candidates = OmnetppIniUtils::getDestinationAddressesFromOmnetppIni(module);
|
||||||
|
waitCounter = 5;
|
||||||
|
initApp = false;
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
//we have more candidates?
|
||||||
|
if (candidates.size() > 0) {
|
||||||
|
if (waitCounter > 0) {
|
||||||
|
waitCounter--;
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
if (candidatesIndex < candidates.size()) {
|
||||||
|
invitePeer(candidates.get(candidatesIndex++));
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (dis->getMembershipService().getLocalState() == JOINED) {
|
||||||
|
if (!splitOnce) {
|
||||||
|
splitOnce = true;
|
||||||
|
PeerIDList pidl;
|
||||||
|
int numberOfSlavesToAdd = 12;
|
||||||
|
PeerIDList peersToAdd = getSpecifiedNumberOfPeers(true, numberOfSlavesToAdd, 4);
|
||||||
|
pidl.add(peersToAdd);
|
||||||
|
splitGroup(TEST_OPTIONS, pidl); //SPLITreq
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test case 8: 96 peers cs 6 (Join - split)
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::testCase08() {
|
||||||
|
int moduleIndex = module.getLocalAddress().getHostAddress().get4().getDByte(3);
|
||||||
|
|
||||||
|
if (initApp) {
|
||||||
|
candidates = OmnetppIniUtils::getDestinationAddressesFromOmnetppIni(module);
|
||||||
|
waitCounter = 5;
|
||||||
|
initApp = false;
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}//End if
|
||||||
|
}//End if
|
||||||
|
if (moduleIndex == 1) {
|
||||||
|
//we have more candidates?
|
||||||
|
if (candidates.size() > 0) {
|
||||||
|
if (waitCounter > 0) {
|
||||||
|
waitCounter--;
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
if (candidatesIndex < candidates.size()) {
|
||||||
|
invitePeer(candidates.get(candidatesIndex++));
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (dis->getMembershipService().getLocalState() == JOINED) {
|
||||||
|
if (!splitOnce) {
|
||||||
|
splitOnce = true;
|
||||||
|
PeerIDList pidl;
|
||||||
|
int numberOfSlavesToAdd = 48;
|
||||||
|
PeerIDList peersToAdd = getSpecifiedNumberOfPeers(true, numberOfSlavesToAdd, 8);
|
||||||
|
pidl.add(peersToAdd);
|
||||||
|
splitGroup(TEST_OPTIONS, pidl); //SPLITreq
|
||||||
|
module.scheduleTestCase(45);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adding the specified number of peers to the peerIDList
|
||||||
|
* @param mixed - if true: master and slaves, if false: only slaves
|
||||||
|
* @param numberOfPeersToAdd - how many peers to add to the list
|
||||||
|
* @param numberOfClusters - number of clusters in the network
|
||||||
|
* @return PeerIDList with the peers to split
|
||||||
|
*/
|
||||||
|
PeerIDList
|
||||||
|
SplitApplication::getSpecifiedNumberOfPeers(bool mixed, int numberOfPeersToAdd, int numberOfClusters) {
|
||||||
|
PeerIDList peersToAdd;
|
||||||
|
for (int i = 0; i < numberOfClusters; i++) {
|
||||||
|
PeerIDList possiblePeers;
|
||||||
|
if (mixed) {
|
||||||
|
possiblePeers = dis->getMembershipService().getPeerIDList();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
possiblePeers = dis->getMembershipService().getClusterPeerIDListSlavesOnly(i);
|
||||||
|
}
|
||||||
|
for (unsigned int j = 0; j < possiblePeers.size(); j++) {
|
||||||
|
peersToAdd.add(possiblePeers.get(j));
|
||||||
|
if (peersToAdd.size() == (unsigned) numberOfPeersToAdd) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (peersToAdd.size() == (unsigned) numberOfPeersToAdd) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return peersToAdd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a new Roster for the given peers and clusters
|
||||||
|
* @param nextPeerId - the next peer id that can be used
|
||||||
|
* @param numberOfClusters - the number of clusters to create
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::createRoster(int nextPeerId, int numberOfClusters) {
|
||||||
|
|
||||||
|
Roster roster;
|
||||||
|
roster.setNextPeerID(nextPeerId);
|
||||||
|
roster.setViewID(nextPeerId);
|
||||||
|
|
||||||
|
PeerDescription dummyPDesc;
|
||||||
|
PeerResources dummyPRes;
|
||||||
|
|
||||||
|
ClusterID cID = 0;
|
||||||
|
for (unsigned int i = 1; i <= numberOfPeers; i++) {
|
||||||
|
|
||||||
|
TransportAddress ta = getNewTransportAddress(i);
|
||||||
|
ta.setPort(module.getLocalAddress().getPort());
|
||||||
|
MemberDescription mDesc(i, ta, JOINED, cID, dummyPDesc, dummyPRes);
|
||||||
|
roster.addMemberDescription(mDesc);
|
||||||
|
|
||||||
|
if ((i % module.getMaxPeerCount()) == 0) {
|
||||||
|
cID++;
|
||||||
|
}//End if
|
||||||
|
}//end for
|
||||||
|
|
||||||
|
//set up group for each peer
|
||||||
|
dis->setupGroupFromRoster(roster, module.getLocalAddress().getHostAddress().get4().getDByte(3));
|
||||||
|
dt = simTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create a new TransportAddress with the given index
|
||||||
|
* @param i - index to create the TransportAddress with
|
||||||
|
* @return the created transportaddress
|
||||||
|
*/
|
||||||
|
TransportAddress
|
||||||
|
SplitApplication::getNewTransportAddress(int i) {
|
||||||
|
std::stringstream taStream;
|
||||||
|
taStream << "192.168.0." << i;
|
||||||
|
std::string s(taStream.str());
|
||||||
|
return TransportAddress(IPvXAddress(s.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SplitApplication::receiveGroupData(const GroupData & dat, const PeerID sender) {
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveGroupData - receive group data from peer ID " << sender;
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinRequestEvent.
|
||||||
|
* @param The event.
|
||||||
|
*
|
||||||
|
* Received an invitation from from a group
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::handleEvent(const JoinRequestEvent & e) {
|
||||||
|
|
||||||
|
DEBUG("invitationReceived - invitation received");
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationReceived - invitationID: " << e.getInvitation().getInvitationID() << " inviterID: " << e.getInvitation().getInviterID();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
|
||||||
|
DEBUG("invitationReceived - accept invitation");
|
||||||
|
PeerDescription pDesc;
|
||||||
|
PeerResources resources;
|
||||||
|
dis->acceptInvitation(e.getInvitation(), "accept invitation", pDesc, resources);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle an incoming JoinConfirmEvent.
|
||||||
|
* @param The event.
|
||||||
|
*
|
||||||
|
* An invitation was accepted by the foreign host.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::handleEvent(const JoinConfirmEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "receiveInvitationResponse - peer at TA: " << e.getInvitation().getInviteeAddress() << " accept invitation " << e.getInvitation().getInvitationID();
|
||||||
|
buf << " message: " << e.getMessage() << ", peer description: " << e.getDescription().getDescription();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SplitApplication::handleEvent(const JoinRejectedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationAborted - invitation ID " << e.getInvitation().getInvitationID() << " aborted";
|
||||||
|
buf << " reason: " << e.getReason();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SplitApplication::handleEvent(const JoinAbortedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "invitationAborted - invitation to peer " << e.getTransportAddress() << " aborted";
|
||||||
|
buf << " reason: " << e.getReason();
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SplitApplication::handleEvent(const PeerJoinedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerJoined - peer " << e.getPeerID() << "@TA_" << e.getTransportAddress() << " joined group successfully (" << e.getDescription().getDescription() << ")";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SplitApplication::handleEvent(const PendingPeersEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerIsPending - peer " << e.getPeerIDList() << " is pending";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SplitApplication::handleEvent(const PeerReconnectedEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerReconnected - peer " << e.getPeerID() << " is reconnected";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals, that a dedicated peer has left the group.
|
||||||
|
* @param peer The left peer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::handleEvent(const PeerLeftEvent & e) {
|
||||||
|
|
||||||
|
std::stringstream buf;
|
||||||
|
buf << "peerLeft - peer " << e.getPeer().getPeerID() << "@TA_" << e.getPeer().getLocalAddress() << " left the group";
|
||||||
|
DEBUG(buf.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals that a split is done
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SplitApplication::handleEvent(const SplitDoneEvent & e) {
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
splitDuration.recordWithTimestamp(simTime() - dt, numberOfPeers);
|
||||||
|
VectorStatistic vs("splitDone");
|
||||||
|
vs.record(GenericTime::currentTime());
|
||||||
|
if (module.getLocalAddress().getHostAddress().get4().getDByte(3) == 1) {
|
||||||
|
TransportAddress ta;
|
||||||
|
ta = getNewTransportAddress(3);
|
||||||
|
dis->mergeGroup(ta);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SplitApplication::handleEvent(const MergeRequestEvent & e) {
|
||||||
|
|
||||||
|
dis->acceptGroupMerge();
|
||||||
|
}
|
||||||
|
}//End namespace moversight
|
||||||
|
}//End namespace ubeeme
|
||||||
|
|
||||||
92
uni/masterarbeit/source/moversight/app/SplitApplication.h
Normal file
92
uni/masterarbeit/source/moversight/app/SplitApplication.h
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* File: SplitApplication.h
|
||||||
|
* Author: sgaebler
|
||||||
|
*
|
||||||
|
* Created on April 12, 2011, 04:37 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SPLITAPPLICATION_H
|
||||||
|
#define SPLITAPPLICATION_H
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "ms/PeerState.h"
|
||||||
|
#include "common/container/PeerIDList.h"
|
||||||
|
#include "simutils/statistics/DurationStatisticRecorder.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class Dispatcher;
|
||||||
|
class Moversight;
|
||||||
|
class Invitation;
|
||||||
|
|
||||||
|
class SplitApplication : public Application {
|
||||||
|
public:
|
||||||
|
|
||||||
|
SplitApplication(Moversight & m);
|
||||||
|
virtual ~SplitApplication();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
void startTestCase(unsigned int i);
|
||||||
|
|
||||||
|
// Event handling
|
||||||
|
virtual void handleEvent(const JoinRequestEvent & e);
|
||||||
|
virtual void handleEvent(const PeerJoinedEvent & e);
|
||||||
|
virtual void handleEvent(const JoinConfirmEvent & e);
|
||||||
|
virtual void handleEvent(const JoinRejectedEvent & e);
|
||||||
|
virtual void handleEvent(const JoinAbortedEvent & e);
|
||||||
|
virtual void handleEvent(const SplitDoneEvent & e);
|
||||||
|
virtual void handleEvent(const MergeRequestEvent & e);
|
||||||
|
virtual void handleEvent(const PendingPeersEvent & e);
|
||||||
|
virtual void handleEvent(const PeerReconnectedEvent & e);
|
||||||
|
virtual void handleEvent(const PeerLeftEvent & e);
|
||||||
|
|
||||||
|
void receiveGroupData(const GroupData & data, const PeerID sender);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void testCase00();
|
||||||
|
void testCase01();
|
||||||
|
void testCase02();
|
||||||
|
void testCase03();
|
||||||
|
void testCase04();
|
||||||
|
void testCase05();
|
||||||
|
void testCase06();
|
||||||
|
void testCase07();
|
||||||
|
void testCase08();
|
||||||
|
|
||||||
|
PeerIDList getSpecifiedNumberOfPeers(bool mixed, int numberOfPeersToAdd, int numberOfClusters);
|
||||||
|
void invitePeer(TransportAddress & ta);
|
||||||
|
void leaveGroup();
|
||||||
|
void sendData();
|
||||||
|
void splitGroup(unsigned char options, PeerIDList splitPeers);
|
||||||
|
|
||||||
|
TransportAddress getNewTransportAddress(int i);
|
||||||
|
void createRoster(int nextPeerId, int numberOfClusters);
|
||||||
|
PeerIDList addToPeerIdList(PeerIDList pidl, int peersToAdd[], int numberOfPeersToAdd);
|
||||||
|
|
||||||
|
PeerState state;
|
||||||
|
|
||||||
|
bool splitOnce;
|
||||||
|
|
||||||
|
int waitCounter;
|
||||||
|
|
||||||
|
int splitCase;
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
cOutVector splitDuration;
|
||||||
|
|
||||||
|
DurationStatisticRecorder joinDelayStat;
|
||||||
|
simtime_t dt;
|
||||||
|
unsigned int numberOfPeers;
|
||||||
|
unsigned int numberOfClusters;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* SPLITAPPLICATION_H */
|
||||||
|
|
||||||
1387
uni/masterarbeit/source/moversight/app/TestApplication.cc
Executable file
1387
uni/masterarbeit/source/moversight/app/TestApplication.cc
Executable file
File diff suppressed because it is too large
Load Diff
115
uni/masterarbeit/source/moversight/app/TestApplication.h
Executable file
115
uni/masterarbeit/source/moversight/app/TestApplication.h
Executable file
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* File: TestApplication.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on April 20, 2011, 11:33 AM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TESTAPPLICATION_H
|
||||||
|
#define TESTAPPLICATION_H
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
#include "simutils/statistics/DurationStatisticRecorder.h"
|
||||||
|
#include "simutils/statistics/VectorStatisticRecorder.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class Dispatcher;
|
||||||
|
class Moversight;
|
||||||
|
class Invitation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class TestApplication
|
||||||
|
* @brief Defines a small test application to test the moversight protocol.
|
||||||
|
*
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @author Jan Gäbler
|
||||||
|
*/
|
||||||
|
class TestApplication : public Application {
|
||||||
|
public:
|
||||||
|
|
||||||
|
TestApplication(Moversight & m);
|
||||||
|
virtual ~TestApplication();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
void startTestCase(unsigned int i);
|
||||||
|
|
||||||
|
void receiveGroupData(const GroupData & data, const PeerID sender);
|
||||||
|
|
||||||
|
// Event handling
|
||||||
|
virtual void handleEvent(const JoinRequestEvent & e);
|
||||||
|
virtual void handleEvent(const JoinConfirmEvent & e);
|
||||||
|
virtual void handleEvent(const JoinRejectedEvent & e);
|
||||||
|
virtual void handleEvent(const JoinAbortedEvent & e);
|
||||||
|
virtual void handleEvent(const GroupCreatedEvent & e);
|
||||||
|
virtual void handleEvent(const GroupClosedEvent & e);
|
||||||
|
virtual void handleEvent(const PeerJoinedEvent & e);
|
||||||
|
virtual void handleEvent(const PendingPeersEvent & e);
|
||||||
|
virtual void handleEvent(const PeerReconnectedEvent & e);
|
||||||
|
virtual void handleEvent(const PeerLeftEvent & e);
|
||||||
|
virtual void handleEvent(const StartMeasuringEvent & e);
|
||||||
|
virtual void handleEvent(const StopMeasuringEvent & e);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void testCase00();
|
||||||
|
void testCase01();
|
||||||
|
void testCase02();
|
||||||
|
void testCase03();
|
||||||
|
void testCase04();
|
||||||
|
void testCase05();
|
||||||
|
void testCase06();
|
||||||
|
void testCase07();
|
||||||
|
void testCase08();
|
||||||
|
void testCase09();
|
||||||
|
void testCase10();
|
||||||
|
void testCase11();
|
||||||
|
void testCase12();
|
||||||
|
void testCase13();
|
||||||
|
void testCase14();
|
||||||
|
void testCase15();
|
||||||
|
void testCase16();
|
||||||
|
void testCase17();
|
||||||
|
void testCase18();
|
||||||
|
void testCase19();
|
||||||
|
void testCase20();
|
||||||
|
void testCase21();
|
||||||
|
void testCase22();
|
||||||
|
/* void testCase23();
|
||||||
|
void testCase24();
|
||||||
|
void testCase25();
|
||||||
|
void testCase26();
|
||||||
|
void testCase27();
|
||||||
|
void testCase28();
|
||||||
|
*/
|
||||||
|
void invitePeer(TransportAddress & ta);
|
||||||
|
void leaveGroup();
|
||||||
|
void sendData();
|
||||||
|
|
||||||
|
void createRoster();
|
||||||
|
TransportAddress getNewTransportAddress(int i);
|
||||||
|
|
||||||
|
DurationStatisticRecorder joinDelayStat;
|
||||||
|
DurationStatisticRecorder dtDelayStat;
|
||||||
|
DurationStatisticRecorder leaveDelayStat;
|
||||||
|
DurationStatisticRecorder rejoinSuccessDuration;
|
||||||
|
VectorStatisticRecorder groupSizeStat;
|
||||||
|
|
||||||
|
size_t waitCounter;
|
||||||
|
size_t groupSize;
|
||||||
|
size_t lastGroupSize;
|
||||||
|
bool hasLeft;
|
||||||
|
|
||||||
|
int numberOfPeers;
|
||||||
|
int clusterSize;
|
||||||
|
int numberOfMobilePeers;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* TESTAPPLICATION_H */
|
||||||
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#include "ApplicationEventReceiver.h"
|
||||||
|
|
||||||
|
#include "GroupClosedEvent.h"
|
||||||
|
#include "JoinGroupDoneEvent.h"
|
||||||
|
#include "GroupCreatedEvent.h"
|
||||||
|
#include "PeerJoinedEvent.h"
|
||||||
|
#include "PeerIsPendingEvent.h"
|
||||||
|
#include "PeerReconnectedEvent.h"
|
||||||
|
#include "PeerLeftEvent.h"
|
||||||
|
#include "LocalPeerUpdateEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
ApplicationEventReceiver::ApplicationEventReceiver(EventSender *sender /*= 0*/) : EventReceiverTemplate<ApplicationEventReceiver>(GroupEvent<EventTypes>::getGroup(), sender) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplicationEventReceiver::connectAll(){
|
||||||
|
|
||||||
|
connectEvent(GroupCreatedEvent::getType(), &ApplicationEventReceiver::groupCreated);
|
||||||
|
connectEvent(JoinGroupDoneEvent::getType(), &ApplicationEventReceiver::joinGroupDone);
|
||||||
|
connectEvent(GroupClosedEvent::getType(), &ApplicationEventReceiver::groupClosed);
|
||||||
|
connectEvent(PeerJoinedEvent::getType(), &ApplicationEventReceiver::peerJoined);
|
||||||
|
connectEvent(PeerIsPendingEvent::getType(), &ApplicationEventReceiver::peerIsPending);
|
||||||
|
connectEvent(PeerReconnectedEvent::getType(), &ApplicationEventReceiver::peerReconnected);
|
||||||
|
connectEvent(PeerLeftEvent::getType(), &ApplicationEventReceiver::peerLeft);
|
||||||
|
connectEvent(LocalPeerUpdateEvent::getType(), &ApplicationEventReceiver::localPeerUpdate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef APPLICATION_EVENT_RECEIVER_H
|
||||||
|
#define APPLICATION_EVENT_RECEIVER_H
|
||||||
|
|
||||||
|
#include <core/event/event_receiver_template.h>
|
||||||
|
#include <core/event/event.h>
|
||||||
|
#include <core/event/event_container.h>
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT ApplicationEventReceiver : public EventReceiverTemplate<ApplicationEventReceiver> {
|
||||||
|
public:
|
||||||
|
|
||||||
|
ApplicationEventReceiver(EventSender *sender = 0);
|
||||||
|
|
||||||
|
virtual ~ApplicationEventReceiver() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void connectAll();
|
||||||
|
|
||||||
|
virtual void groupCreated(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void joinGroupDone(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void groupClosed(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void peerJoined(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void peerIsPending(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void peerReconnected(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void peerLeft(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void localPeerUpdate(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void mergeDone(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void mergeNotify(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void splitDone(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void splitNotify(EventContainer /* e */) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // APPLICATION_EVENT_RECEIVER_H
|
||||||
32
uni/masterarbeit/source/moversight/app/events/EventTypes.h
Normal file
32
uni/masterarbeit/source/moversight/app/events/EventTypes.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef EVENT_TYPES_H
|
||||||
|
#define EVENT_TYPES_H
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class EventTypes {
|
||||||
|
public:
|
||||||
|
enum Event
|
||||||
|
{
|
||||||
|
PEER_JOINED_EVENT = 1,
|
||||||
|
PEER_IS_PENDING_EVENT,
|
||||||
|
PEER_RECONNECTED_EVENT,
|
||||||
|
PEER_LEFT_EVENT,
|
||||||
|
LOCAL_PEER_UPDATE_EVENT,
|
||||||
|
GROUP_CREATED_EVENT,
|
||||||
|
JOIN_GROUP_DONE_EVENT,
|
||||||
|
GROUP_CLOSED_EVENT,
|
||||||
|
SPLIT_NOTIFY_EVENT,
|
||||||
|
SPLIT_DONE_EVENT,
|
||||||
|
MERGE_DONE_EVENT,
|
||||||
|
MERGE_NOTIFY_EVENT,
|
||||||
|
REJOIN_DONE_EVENT,
|
||||||
|
EVENT_TYPES_COUNT // has to be last
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // EVENT_TYPES_H
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#include "GroupClosedEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
GroupClosedEvent::GroupClosedEvent(): GroupEvent<EventTypes>(getType()){
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupClosedEvent::~GroupClosedEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType GroupClosedEvent::getType(){
|
||||||
|
return EventType(getGroup(), EventTypes::GROUP_CLOSED_EVENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef GROUPCLOSEDEVENT_H
|
||||||
|
#define GROUPCLOSEDEVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT GroupClosedEvent: public GroupEvent<EventTypes> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
GroupClosedEvent();
|
||||||
|
virtual ~GroupClosedEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // GROUPCREATEDEVENT_H
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#include "GroupCreatedEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
GroupCreatedEvent::GroupCreatedEvent(Peer p): GroupEvent<EventTypes>(getType()), localPeer(p){
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupCreatedEvent::~GroupCreatedEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType GroupCreatedEvent::getType(){
|
||||||
|
return EventType(getGroup(), EventTypes::GROUP_CREATED_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Peer GroupCreatedEvent::getLocalPeer(){
|
||||||
|
return localPeer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GroupCreatedEvent::setLocalPeer(Peer p){
|
||||||
|
localPeer = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef GROUPCREATEDEVENT_H
|
||||||
|
#define GROUPCREATEDEVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Peer.h"
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT GroupCreatedEvent: public GroupEvent<EventTypes> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
GroupCreatedEvent(Peer p);
|
||||||
|
virtual ~GroupCreatedEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
Peer getLocalPeer();
|
||||||
|
void setLocalPeer(Peer p);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Peer localPeer;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // GROUPCREATEDEVENT_H
|
||||||
39
uni/masterarbeit/source/moversight/app/events/GroupMessage.h
Normal file
39
uni/masterarbeit/source/moversight/app/events/GroupMessage.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef GROUP_MESSAGE_H
|
||||||
|
#define GROUP_MESSAGE_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#include <core/network/generic_message.h>
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
namespace ubeeme
|
||||||
|
{
|
||||||
|
namespace moversight
|
||||||
|
{
|
||||||
|
class MOV_EXPORT GroupMessage : public GenericMessage<moversight::PeerID>
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
GroupMessage(int type, std::string tag = "") : GenericMessage<moversight::PeerID>(type, tag) {}
|
||||||
|
virtual ~GroupMessage() {}
|
||||||
|
|
||||||
|
inline virtual std::string toString() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string
|
||||||
|
GroupMessage::toString() const
|
||||||
|
{
|
||||||
|
std::ostringstream out;
|
||||||
|
out << "GroupMessage [" << header.getModuleTag() << "] from type: " << header.getMessageType();
|
||||||
|
|
||||||
|
return out.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // GROUP_MESSAGE_H
|
||||||
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#include "GroupMessageFactory.h"
|
||||||
|
|
||||||
|
namespace ubeeme
|
||||||
|
{
|
||||||
|
namespace moversight
|
||||||
|
{
|
||||||
|
GroupMessageFactory::~GroupMessageFactory() {}
|
||||||
|
|
||||||
|
QSharedPointer<GroupMessage>
|
||||||
|
GroupMessageFactory::createMessage(ByteArray const &buffer, PeerID const &from)
|
||||||
|
{
|
||||||
|
char const *start = buffer.data();
|
||||||
|
int size = buffer.size();
|
||||||
|
|
||||||
|
int type = validateHeader(start, size);
|
||||||
|
|
||||||
|
if (type != MessageHeader<PeerID>::UNKNOWN_MESSAGE_TYPE) {
|
||||||
|
QSharedPointer<GroupMessage> message = internalCreateMessage(type, start, size);
|
||||||
|
|
||||||
|
if (!message.isNull()) {
|
||||||
|
message->setFrom(from);
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
return QSharedPointer<GroupMessage>();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef GROUP_MESSAGE_FACTORY_H
|
||||||
|
#define GROUP_MESSAGE_FACTORY_H
|
||||||
|
|
||||||
|
#include "core/network/message_validator.h"
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
#include "GroupMessage.h"
|
||||||
|
|
||||||
|
namespace ubeeme
|
||||||
|
{
|
||||||
|
namespace moversight
|
||||||
|
{
|
||||||
|
class MOV_EXPORT GroupMessageFactory : public ubeeme::MessageValidator<PeerID>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~GroupMessageFactory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a message out of the given buffer and the PeerID the message was received from.
|
||||||
|
* @param buffer Buffer the message should created of.
|
||||||
|
* @param from PeerID the message was reiceved from.
|
||||||
|
* @returns The created message.
|
||||||
|
*/
|
||||||
|
QSharedPointer<GroupMessage> createMessage(ByteArray const &buffer, PeerID const &from);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* @brief Creates the concrete message by given message type and buffer.
|
||||||
|
* @param messageType The type of message in the scope a module.
|
||||||
|
* @param buffer Buffer the message should created of.
|
||||||
|
* @param size Size of the buffer to use for deserialization.
|
||||||
|
* @returns The created message.
|
||||||
|
* @note Use the deserializePayload method of network message to deserialize the concreate message.
|
||||||
|
*/
|
||||||
|
virtual QSharedPointer<GroupMessage> internalCreateMessage(int messageType, char const *buffer, int size) = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // GROUP_MESSAGE_FACTORY_H
|
||||||
|
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#include "JoinGroupDoneEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
JoinGroupDoneEvent::JoinGroupDoneEvent(Peer const &p): GroupEvent<EventTypes>(getType()), localPeer(p) {
|
||||||
|
}
|
||||||
|
|
||||||
|
JoinGroupDoneEvent::~JoinGroupDoneEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType JoinGroupDoneEvent::getType(){
|
||||||
|
return EventType(getGroup(), EventTypes::JOIN_GROUP_DONE_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
Peer const & JoinGroupDoneEvent::getLocalPeer() const{
|
||||||
|
return localPeer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JoinGroupDoneEvent::setLocalPeer(Peer const &p){
|
||||||
|
localPeer = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef JOIN_GROUP_DONE_EVENT_H
|
||||||
|
#define JOIN_GROUP_DONE_EVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Peer.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT JoinGroupDoneEvent: public GroupEvent<EventTypes> {
|
||||||
|
public:
|
||||||
|
|
||||||
|
JoinGroupDoneEvent(Peer const &p);
|
||||||
|
virtual ~JoinGroupDoneEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
Peer const &getLocalPeer() const;
|
||||||
|
void setLocalPeer(Peer const &p);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Peer localPeer;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // JOIN_GROUP_DONE_EVENT_H
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#include "LocalPeerUpdateEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
LocalPeerUpdateEvent::LocalPeerUpdateEvent(Peer const &p): GroupEvent<EventTypes>(getType()), localPeer(p) {
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalPeerUpdateEvent::~LocalPeerUpdateEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType LocalPeerUpdateEvent::getType(){
|
||||||
|
return EventType(getGroup(), EventTypes::LOCAL_PEER_UPDATE_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
Peer const &LocalPeerUpdateEvent::getLocalPeer() const{
|
||||||
|
return localPeer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocalPeerUpdateEvent::setLocalPeer(Peer const &p){
|
||||||
|
localPeer = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef LOCAL_PEER_UPDATE_EVENT_H
|
||||||
|
#define LOCAL_PEER_UPDATE_EVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Peer.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT LocalPeerUpdateEvent: public GroupEvent<EventTypes> {
|
||||||
|
public:
|
||||||
|
|
||||||
|
LocalPeerUpdateEvent(Peer const &p);
|
||||||
|
virtual ~LocalPeerUpdateEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
Peer const &getLocalPeer() const;
|
||||||
|
void setLocalPeer(Peer const &p);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Peer localPeer;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // LOCAL_PEER_UPDATE_EVENT_H
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#include "MergeDoneEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
MergeDoneEvent::MergeDoneEvent() : GroupEvent<EventTypes>(getType()){
|
||||||
|
}
|
||||||
|
|
||||||
|
MergeDoneEvent::~MergeDoneEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType MergeDoneEvent::getType() {
|
||||||
|
return EventType(getGroup(), EventTypes::MERGE_DONE_EVENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}// namespace ubeeme
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MERGE_DONE_EVENT_H
|
||||||
|
#define MERGE_DONE_EVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT MergeDoneEvent: public GroupEvent<EventTypes> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
MergeDoneEvent();
|
||||||
|
virtual ~MergeDoneEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // MERGE_NOTIFY_EVENT_H
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#include "MergeNotifyEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
MergeNotifyEvent::MergeNotifyEvent() : GroupEvent<EventTypes>(getType()){
|
||||||
|
}
|
||||||
|
|
||||||
|
MergeNotifyEvent::~MergeNotifyEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType MergeNotifyEvent::getType() {
|
||||||
|
return EventType(getGroup(), EventTypes::MERGE_NOTIFY_EVENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}// namespace ubeeme
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MERGE_NOTIFY_EVENT_H
|
||||||
|
#define MERGE_NOTIFY_EVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT MergeNotifyEvent: public GroupEvent<EventTypes> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
MergeNotifyEvent();
|
||||||
|
virtual ~MergeNotifyEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // MERGE_NOTIFY_EVENT_H
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#include "PeerIsPendingEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
PeerIsPendingEvent::PeerIsPendingEvent(PeerID const &pId, TransportAddress const &ta) : GroupEvent<EventTypes>(getType()), pendingPeerID(pId), pendingPeerTA(ta) {
|
||||||
|
}
|
||||||
|
|
||||||
|
PeerIsPendingEvent::~PeerIsPendingEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType PeerIsPendingEvent::getType() {
|
||||||
|
return EventType(getGroup(), EventTypes::PEER_IS_PENDING_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
PeerID const &PeerIsPendingEvent::getPendingPeerID() const{
|
||||||
|
return pendingPeerID;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeerIsPendingEvent::setPendingPeerID(PeerID const &pId){
|
||||||
|
pendingPeerID = pId;
|
||||||
|
}
|
||||||
|
|
||||||
|
TransportAddress const &PeerIsPendingEvent::getPendingPeerTA() const{
|
||||||
|
return pendingPeerTA;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeerIsPendingEvent::setPendingPeerTA(TransportAddress const &ta){
|
||||||
|
pendingPeerTA = ta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef PEER_IS_PENDING_EVENT_H
|
||||||
|
#define PEER_IS_PENDING_EVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT PeerIsPendingEvent: public GroupEvent<EventTypes> {
|
||||||
|
public:
|
||||||
|
|
||||||
|
PeerIsPendingEvent(PeerID const &pId, TransportAddress const &ta);
|
||||||
|
virtual ~PeerIsPendingEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
PeerID const &getPendingPeerID() const;
|
||||||
|
void setPendingPeerID(PeerID const &pId);
|
||||||
|
|
||||||
|
TransportAddress const &getPendingPeerTA() const;
|
||||||
|
void setPendingPeerTA(TransportAddress const &aTa);
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
PeerID pendingPeerID;
|
||||||
|
TransportAddress pendingPeerTA;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // PEER_IS_PENDING_EVENT_H
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#include "PeerJoinedEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
PeerJoinedEvent::PeerJoinedEvent(PeerID const &pId, TransportAddress const &ta, PeerDescription const &pDesc) : GroupEvent<EventTypes>(getType()), joinedPeerID(pId), joinedPeerDesc(pDesc), joinedPeerTA(ta){
|
||||||
|
}
|
||||||
|
|
||||||
|
PeerJoinedEvent::~PeerJoinedEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType PeerJoinedEvent::getType(){
|
||||||
|
return EventType(getGroup(), EventTypes::PEER_JOINED_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
PeerID const &PeerJoinedEvent::getJoinedPeerID() const{
|
||||||
|
return joinedPeerID;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeerJoinedEvent::setJoinedPeerID(PeerID const &pId){
|
||||||
|
joinedPeerID = pId;
|
||||||
|
}
|
||||||
|
|
||||||
|
PeerDescription const &PeerJoinedEvent::getPeerDescription() const{
|
||||||
|
return joinedPeerDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeerJoinedEvent::setPeerDescription(PeerDescription const &pDesc){
|
||||||
|
joinedPeerDesc = pDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
TransportAddress const &PeerJoinedEvent::getJoinedPeerTA() const{
|
||||||
|
return joinedPeerTA;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeerJoinedEvent::setJoinedPeerTA(TransportAddress const &ta){
|
||||||
|
joinedPeerTA = ta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef PEER_JOINED_EVENT_H
|
||||||
|
#define PEER_JOINED_EVENT_H
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "app/PeerDescription.h"
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT PeerJoinedEvent: public GroupEvent<EventTypes> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
PeerJoinedEvent(PeerID const &pId, TransportAddress const &ta, PeerDescription const &pDesc);
|
||||||
|
|
||||||
|
virtual ~PeerJoinedEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
PeerID const &getJoinedPeerID() const;
|
||||||
|
void setJoinedPeerID(PeerID const &pId);
|
||||||
|
|
||||||
|
PeerDescription const &getPeerDescription() const;
|
||||||
|
void setPeerDescription(PeerDescription const & pDesc);
|
||||||
|
|
||||||
|
TransportAddress const &getJoinedPeerTA() const;
|
||||||
|
void setJoinedPeerTA(TransportAddress const & ta);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
PeerID joinedPeerID;
|
||||||
|
PeerDescription joinedPeerDesc;
|
||||||
|
TransportAddress joinedPeerTA;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // PEER_JOINED_EVENT_H
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#include "PeerLeftEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
PeerLeftEvent::PeerLeftEvent(PeerID const &pId, TransportAddress const &ta) : GroupEvent<EventTypes>(getType()), leftPeerID(pId), leftPeerTA(ta){
|
||||||
|
}
|
||||||
|
|
||||||
|
PeerLeftEvent::~PeerLeftEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType PeerLeftEvent::getType() {
|
||||||
|
return EventType(getGroup(), EventTypes::PEER_LEFT_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
PeerID const &PeerLeftEvent::getLeftPeerID() const{
|
||||||
|
return leftPeerID;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeerLeftEvent::setLeftPeerID(PeerID const &pId){
|
||||||
|
leftPeerID = pId;
|
||||||
|
}
|
||||||
|
|
||||||
|
TransportAddress const &PeerLeftEvent::getLeftPeerTA() const{
|
||||||
|
return leftPeerTA;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeerLeftEvent::setLeftPeerTA(TransportAddress const &ta){
|
||||||
|
leftPeerTA = ta;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}// namespace ubeeme
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef PEER_LEFT_EVENT_H
|
||||||
|
#define PEER_LEFT_EVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT PeerLeftEvent: public GroupEvent<EventTypes> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
PeerLeftEvent(PeerID const &pId, TransportAddress const &ta);
|
||||||
|
virtual ~PeerLeftEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
PeerID const &getLeftPeerID() const;
|
||||||
|
void setLeftPeerID(PeerID const &pId);
|
||||||
|
|
||||||
|
TransportAddress const &getLeftPeerTA() const;
|
||||||
|
void setLeftPeerTA(TransportAddress const &aTa);
|
||||||
|
|
||||||
|
private:
|
||||||
|
PeerID leftPeerID;
|
||||||
|
TransportAddress leftPeerTA;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // PEER_LEFT_EVENT_H
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#include "PeerReconnectedEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
PeerReconnectedEvent::PeerReconnectedEvent(PeerID const &pId, TransportAddress const &ta) : GroupEvent<EventTypes>(getType()), reconnectedPeerID(pId), reconnectedPeerTA(ta){
|
||||||
|
}
|
||||||
|
|
||||||
|
PeerReconnectedEvent::~PeerReconnectedEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType PeerReconnectedEvent::getType(){
|
||||||
|
return EventType(getGroup(), EventTypes::PEER_RECONNECTED_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
PeerID const &PeerReconnectedEvent::getReconnectedPeerID() const{
|
||||||
|
return reconnectedPeerID;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeerReconnectedEvent::setReconnectePeerID(PeerID const &pId){
|
||||||
|
reconnectedPeerID = pId;
|
||||||
|
}
|
||||||
|
|
||||||
|
TransportAddress const &PeerReconnectedEvent::getReconnectedPeerTA() const{
|
||||||
|
return reconnectedPeerTA;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeerReconnectedEvent::setReconnectePeerTA(TransportAddress const &ta){
|
||||||
|
reconnectedPeerTA = ta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef PEER_RECONNECTED_EVENT_H
|
||||||
|
#define PEER_RECONNECTED_EVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT PeerReconnectedEvent: public GroupEvent<EventTypes> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
PeerReconnectedEvent(PeerID const &pId, TransportAddress const &ta);
|
||||||
|
virtual ~PeerReconnectedEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
PeerID const &getReconnectedPeerID() const;
|
||||||
|
void setReconnectePeerID(PeerID const &pId);
|
||||||
|
|
||||||
|
TransportAddress const &getReconnectedPeerTA() const;
|
||||||
|
void setReconnectePeerTA(TransportAddress const &aTa);
|
||||||
|
|
||||||
|
private:
|
||||||
|
PeerID reconnectedPeerID;
|
||||||
|
TransportAddress reconnectedPeerTA;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // PEER_RECONNECTED_EVENT_H
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#include "RejoinDoneEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*/
|
||||||
|
RejoinDoneEvent::RejoinDoneEvent() : GroupEvent<EventTypes>(getType()){
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
RejoinDoneEvent::~RejoinDoneEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the EventType.
|
||||||
|
* @return The Eventtype - RejoinDoneEvent
|
||||||
|
*/
|
||||||
|
EventType RejoinDoneEvent::getType() {
|
||||||
|
return EventType(getGroup(), EventTypes::REJOIN_DONE_EVENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}// namespace ubeeme
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPLIT_DONE_EVENT_H
|
||||||
|
#define SPLIT_DONE_EVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT RejoinDoneEvent: public GroupEvent<EventTypes> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
RejoinDoneEvent();
|
||||||
|
virtual ~RejoinDoneEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // SPLIT_NOTIFY_EVENT_H
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#include "SplitDoneEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
SplitDoneEvent::SplitDoneEvent() : GroupEvent<EventTypes>(getType()){
|
||||||
|
}
|
||||||
|
|
||||||
|
SplitDoneEvent::~SplitDoneEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType SplitDoneEvent::getType() {
|
||||||
|
return EventType(getGroup(), EventTypes::SPLIT_DONE_EVENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}// namespace ubeeme
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPLIT_DONE_EVENT_H
|
||||||
|
#define SPLIT_DONE_EVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT SplitDoneEvent: public GroupEvent<EventTypes> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
SplitDoneEvent();
|
||||||
|
virtual ~SplitDoneEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // SPLIT_NOTIFY_EVENT_H
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#include "SplitNotifyEvent.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
SplitNotifyEvent::SplitNotifyEvent() : GroupEvent<EventTypes>(getType()){
|
||||||
|
}
|
||||||
|
|
||||||
|
SplitNotifyEvent::~SplitNotifyEvent(){
|
||||||
|
}
|
||||||
|
|
||||||
|
EventType SplitNotifyEvent::getType() {
|
||||||
|
return EventType(getGroup(), EventTypes::SPLIT_NOTIFY_EVENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}// namespace ubeeme
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPLIT_NOTIFY_EVENT_H
|
||||||
|
#define SPLIT_NOTIFY_EVENT_H
|
||||||
|
|
||||||
|
#include <core/event/group_event.h>
|
||||||
|
|
||||||
|
#include "EventTypes.h"
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class MOV_EXPORT SplitNotifyEvent: public GroupEvent<EventTypes> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
SplitNotifyEvent();
|
||||||
|
virtual ~SplitNotifyEvent();
|
||||||
|
static EventType getType();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} // namespace ubeeme
|
||||||
|
|
||||||
|
#endif // SPLIT_NOTIFY_EVENT_H
|
||||||
115
uni/masterarbeit/source/moversight/common/Defines.h
Normal file
115
uni/masterarbeit/source/moversight/common/Defines.h
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* File: Defines.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on June 28, 2010, 2:40 PM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef DEFINES_H
|
||||||
|
#define DEFINES_H
|
||||||
|
|
||||||
|
#include "Platform.h"
|
||||||
|
#include "ms/PeerID.h"
|
||||||
|
#include "ms/InvitationID.h"
|
||||||
|
#include "ms/ViewID.h"
|
||||||
|
#include "ms/register/ClusterID.h"
|
||||||
|
|
||||||
|
//general includes
|
||||||
|
#include <cstddef>
|
||||||
|
#include <ostream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
#include <utility>
|
||||||
|
#include <functional>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
using ::std::size_t;
|
||||||
|
using ::std::cout;
|
||||||
|
using ::std::cerr;
|
||||||
|
using ::std::endl;
|
||||||
|
|
||||||
|
//fallback for environments, witch operates without the Netbeans environment
|
||||||
|
#ifndef CLOUD_SYNC_ENABLED
|
||||||
|
#define CLOUD_SYNC_ENABLED 0
|
||||||
|
//if the cloud storage disabled, we have to enable the p2p storage and vice versa
|
||||||
|
#define P2P_SYNC_ENABLED 1
|
||||||
|
#endif
|
||||||
|
//again, only one storing method can be used for resync a peer
|
||||||
|
#if CLOUD_SYNC_ENABLED
|
||||||
|
#define P2P_SYNC_ENABLED 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <omnetpp.h>
|
||||||
|
#include "IPvXAddress.h"
|
||||||
|
|
||||||
|
#define MOV_DEBUG EV
|
||||||
|
#define MOV_EXPORT
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include "core/debugging/debug.h"
|
||||||
|
|
||||||
|
#include "common/utypes.h"
|
||||||
|
#include "core/network/host_address.h"
|
||||||
|
#include "common/ubeeme_global.h"
|
||||||
|
|
||||||
|
using ubeeme::uint16;
|
||||||
|
using ubeeme::uint32;
|
||||||
|
|
||||||
|
using ubeeme::HostAddress;
|
||||||
|
|
||||||
|
#define MOV_EXPORT UBEEME_EXPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines the shifts for the option parameter within the SPA message.
|
||||||
|
*/
|
||||||
|
enum ShiftTypes {
|
||||||
|
SHIFT_SEMANTIC = 0x7, //0b00000111,
|
||||||
|
SHIFT_FLUSH = 0x6, //0b00000110,
|
||||||
|
SHIFT_REPLY = 0x5 //0b00000101
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines the test bit for each synchronisation
|
||||||
|
*/
|
||||||
|
enum SyncTypes {
|
||||||
|
FLUSH = 0x1, //0b00000001,
|
||||||
|
SEMANTIC = 0x1, //0b00000001
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines the bit masks for the reply parameter within the SPA message.
|
||||||
|
*/
|
||||||
|
enum ReplyTypes {
|
||||||
|
REPLY_ALL = 0x1, //0b00000001
|
||||||
|
};
|
||||||
|
|
||||||
|
#if OMNETPP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Represents a host address within omnetpp
|
||||||
|
*/
|
||||||
|
typedef IPvXAddress HostAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Represents a port within omnetpp
|
||||||
|
*/
|
||||||
|
typedef uint16_t Port;
|
||||||
|
#else
|
||||||
|
typedef PortType Port;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* DEFINES_H */
|
||||||
369
uni/masterarbeit/source/moversight/common/Exception.h
Normal file
369
uni/masterarbeit/source/moversight/common/Exception.h
Normal file
@@ -0,0 +1,369 @@
|
|||||||
|
/*
|
||||||
|
* File: Exception.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on May 6, 2010, 9:44 AM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef UBEEME_EXCEPTION_H
|
||||||
|
#define UBEEME_EXCEPTION_H
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class Exception
|
||||||
|
* @brief Defines a set of exceptions, used within Moversight.
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @author Jan Gäbler
|
||||||
|
*/
|
||||||
|
class Exception : public std::exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param message the exception message - what has happened
|
||||||
|
*/
|
||||||
|
Exception(const char* message) {
|
||||||
|
m = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
virtual
|
||||||
|
~Exception() throw () {
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A Java style toString implementation. Returns, what has happened.
|
||||||
|
* @return What has happened.
|
||||||
|
*/
|
||||||
|
const char*
|
||||||
|
toString() {
|
||||||
|
return what();
|
||||||
|
}//End toString
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Overrides the standard what method and tells, what has happened.
|
||||||
|
* @return What has happened.
|
||||||
|
*/
|
||||||
|
virtual const char*
|
||||||
|
what() const throw () {
|
||||||
|
return m.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* @brief Stores the exeption message.
|
||||||
|
*/
|
||||||
|
std::string m;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Exception();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a null pointer expception. Used to signal a null pointer error during the execution.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class NullPointerException
|
||||||
|
*/
|
||||||
|
class NullPointerException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param message what has happened?
|
||||||
|
*/
|
||||||
|
NullPointerException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a logic expception. Used to signal a logical error during the execution.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class LogicException
|
||||||
|
*/
|
||||||
|
class LogicException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param message what has happened?
|
||||||
|
*/
|
||||||
|
LogicException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a not implemented yet expception. Used to signal not implemented methods.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class NotImplementedYetException
|
||||||
|
*/
|
||||||
|
class NotImplementedYetException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param message what has happened?
|
||||||
|
*/
|
||||||
|
NotImplementedYetException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines an index out of bounce exception. Used to signal index errors.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class IndexOutOfBounceException
|
||||||
|
*/
|
||||||
|
class IndexOutOfBounceException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
IndexOutOfBounceException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines an attribute not set exception. Used to signal the access of undefined references or values.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class AttributeNotSetException
|
||||||
|
*/
|
||||||
|
class AttributeNotSetException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
AttributeNotSetException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a peer not found exception. Used to signal the call for a peer, not stored or found within a list, a cluster et cetera.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class PeerNotFoundException
|
||||||
|
*/
|
||||||
|
class PeerNotFoundException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
PeerNotFoundException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a entry not found exception. Used to signal that a table or map lookup (or similar) has been failed, as the desired element was not found within the storage structure.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class EntryNotFoundException
|
||||||
|
*/
|
||||||
|
class EntryNotFoundException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
EntryNotFoundException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a cluster not found exception. Used to signal the call for a cluster, not stored or found within a list, a group et cetera.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class ClusterNotFoundException
|
||||||
|
*/
|
||||||
|
class ClusterNotFoundException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
ClusterNotFoundException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a peer place exception. Used to signal that an error have occur during placing a peer within the topology.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class PeerPlaceException
|
||||||
|
*/
|
||||||
|
class PeerPlaceException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
PeerPlaceException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines cluster limit reached exception. Used to signal that no more clusters can be created within the acutal group setting.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class ClusterLimitReachedException
|
||||||
|
*/
|
||||||
|
class ClusterLimitReachedException : public PeerPlaceException {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
ClusterLimitReachedException(const char* message) : PeerPlaceException(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a timer not found exception. Used to signal timer errors.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class TimerNotFoundException
|
||||||
|
*/
|
||||||
|
class TimerNotFoundException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
TimerNotFoundException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a invitation not found exception. Used to signal invitation missing errors.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class InvitationNotFoundException
|
||||||
|
*/
|
||||||
|
class InvitationNotFoundException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
InvitationNotFoundException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a parameter exception. Used to signal setup errors.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class ParameterException
|
||||||
|
*/
|
||||||
|
class ParameterException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
ParameterException(const char* message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines an illegal parameter exception. Used to signal that a given parameter is not valid within the current context.
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class IllegalParameterException
|
||||||
|
*/
|
||||||
|
class IllegalParameterException : public ParameterException {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
IllegalParameterException(const char * message) : ParameterException(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a flush in progress exception. Used to signal that a flush is in progress and no other split or merge is allowed.
|
||||||
|
* @author Silvio Gaebler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class FlushModeException
|
||||||
|
*/
|
||||||
|
class FlushModeException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
FlushModeException(const char * message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a secondary group exception. Signals that the peer is not allowed to do an action because it's not in the primary group(ongoing partition).
|
||||||
|
* @author Grit Schneider
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class SecondaryGroupException
|
||||||
|
*/
|
||||||
|
class SecondaryGroupException : public Exception {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
SecondaryGroupException(const char * message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines a rejoin lock exception. Signals that the peer is not allowed to do an action because it's actually locked due to a ongoing rejoin.
|
||||||
|
* @author Grit Schneider
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @class RejoinLockException
|
||||||
|
*/
|
||||||
|
class RejoinLockException : public Exception {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* @param message What has happened?
|
||||||
|
*/
|
||||||
|
RejoinLockException(const char * message) : Exception(message) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* UBEEME_EXCEPTION_H */
|
||||||
|
|
||||||
456
uni/masterarbeit/source/moversight/common/MoversightService.cc
Normal file
456
uni/masterarbeit/source/moversight/common/MoversightService.cc
Normal file
@@ -0,0 +1,456 @@
|
|||||||
|
#include "MoversightService.h"
|
||||||
|
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
#include "Moversight.h"
|
||||||
|
|
||||||
|
#include "common/transport/msg/ExteriorMessage.h"
|
||||||
|
#include "common/time/VirtualLogicalTime.h"
|
||||||
|
#include "mt/msg/MulticastMessage.h"
|
||||||
|
#include "ut/msg/UnicastMessage.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param d A reference to the moversight dispatcher
|
||||||
|
*/
|
||||||
|
MoversightService::MoversightService(Dispatcher & d, std::string name)
|
||||||
|
: ObjectListener(name),
|
||||||
|
dispatcher(d),
|
||||||
|
module(dispatcher.getMoversight()) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy constructor
|
||||||
|
* @param other The instance to copy.
|
||||||
|
*/
|
||||||
|
MoversightService::MoversightService(const MoversightService& other)
|
||||||
|
: ObjectListener(other.getServiceName()), dispatcher(other.dispatcher), module(other.module) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
MoversightService::~MoversightService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the current view ID.
|
||||||
|
* @return The desired view ID.
|
||||||
|
*/
|
||||||
|
ViewID
|
||||||
|
MoversightService::getViewID() const {
|
||||||
|
return dispatcher.getMembershipService().getViewID();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the last view ID.
|
||||||
|
* @return The last view ID.
|
||||||
|
*/
|
||||||
|
ViewID
|
||||||
|
MoversightService::getLastViewID() const {
|
||||||
|
return dispatcher.getMembershipService().getLastViewID();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the master id list from the membership service.
|
||||||
|
* @return A list containing all master IDs.
|
||||||
|
*/
|
||||||
|
PeerIDList
|
||||||
|
MoversightService::getMasterIDList() {
|
||||||
|
return dispatcher.getMembershipService().getMasterPeerIDList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Permits access to the local moversight peer instance.
|
||||||
|
* @return The local peer instance.
|
||||||
|
*/
|
||||||
|
Peer &
|
||||||
|
MoversightService::getLocalPeer() {
|
||||||
|
return dispatcher.getMembershipService().getLocalPeer();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Permits access to the local moversight peer instance.
|
||||||
|
* @return The local peer instance.
|
||||||
|
*/
|
||||||
|
const Peer &
|
||||||
|
MoversightService::getLocalPeer() const {
|
||||||
|
return dispatcher.getMembershipService().getLocalPeer();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the Peer ID of the local peer.
|
||||||
|
* @return The id of the local peer instance.
|
||||||
|
*/
|
||||||
|
PeerID
|
||||||
|
MoversightService::getLocalID() {
|
||||||
|
return getLocalPeer().getPeerID();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the transport address of the local peer.
|
||||||
|
* @return The transport address of the local peer.
|
||||||
|
*/
|
||||||
|
TransportAddress const &
|
||||||
|
MoversightService::getLocalAddress() {
|
||||||
|
return module.getLocalAddress();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns true, if the local peer master.
|
||||||
|
* @return True, if the local peer master, false otherwise.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
MoversightService::isLocalPeerMaster() {
|
||||||
|
return getLocalPeer().isMaster();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the peer ID of the master peer from the local peer.
|
||||||
|
* @return The ID of the master peer from the local peer.
|
||||||
|
*/
|
||||||
|
PeerID
|
||||||
|
MoversightService::getLocalMasterID() const {
|
||||||
|
return getLocalPeer().getMasterID();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the peer state of the local peer.
|
||||||
|
* @return The peer state of the local peer.
|
||||||
|
*/
|
||||||
|
PeerState &
|
||||||
|
MoversightService::getLocalPeerState() {
|
||||||
|
return getLocalPeer().getPeerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the peer state of the local peer.
|
||||||
|
* @return The peer state of the local peer.
|
||||||
|
*/
|
||||||
|
const PeerState &
|
||||||
|
MoversightService::getLocalPeerState() const {
|
||||||
|
return getLocalPeer().getPeerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the (main) state of the local peer.
|
||||||
|
* @return The (main) state of the local peer.
|
||||||
|
*/
|
||||||
|
const State &
|
||||||
|
MoversightService::getLocalState() const {
|
||||||
|
return getLocalPeer().getState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the local (main) state of the peer.
|
||||||
|
* @param s The (main) state to set.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::setLocalState(const State & s) {
|
||||||
|
getLocalPeerState().setState(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the sub state of the local peer.
|
||||||
|
* @return The sub state of the local peer.
|
||||||
|
*/
|
||||||
|
const SubState &
|
||||||
|
MoversightService::getLocalSubState() const {
|
||||||
|
return getLocalPeer().getSubState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the local sub state.
|
||||||
|
* @param sub The sub state to set.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::setLocalSubState(const SubState & sub) {
|
||||||
|
getLocalPeerState().setSubState(sub);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the state operation of the local peer.
|
||||||
|
* @return The state operation of the local peer.
|
||||||
|
*/
|
||||||
|
const StateOperation &
|
||||||
|
MoversightService::getLocalStateOperation() const {
|
||||||
|
return getLocalPeer().getStateOperation();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the state operation of the local peer.
|
||||||
|
* @param op The state operation to set.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::setLocalStateOperation(const StateOperation & op) {
|
||||||
|
getLocalPeerState().setStateOperation(op);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the peer state of the given peer.
|
||||||
|
* @param id The id of the peer to read.
|
||||||
|
* @return The peer state of the given peer.
|
||||||
|
*/
|
||||||
|
PeerState &
|
||||||
|
MoversightService::getPeerState(PeerID id) {
|
||||||
|
return dispatcher.getMembershipService().getPeer(id).getPeerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the peer state of the given peer.
|
||||||
|
* @param id The id of the peer to read.
|
||||||
|
* @return The peer state of the given peer.
|
||||||
|
*/
|
||||||
|
const PeerState &
|
||||||
|
MoversightService::getPeerState(PeerID id) const {
|
||||||
|
return dispatcher.getMembershipService().getPeer(id).getPeerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the state of the given peer.
|
||||||
|
* @param id The id of the peer to read.
|
||||||
|
* @return The state of the given peer.
|
||||||
|
*/
|
||||||
|
const State &
|
||||||
|
MoversightService::getState(PeerID id) const {
|
||||||
|
return getPeerState(id).getState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the state of the given peer.
|
||||||
|
* @param id The id of the peer to set.
|
||||||
|
* @param s The state to set.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::setState(PeerID id, const State & s) {
|
||||||
|
getPeerState(id).setState(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the sub state of the given peer.
|
||||||
|
* @param id The id of the peer to read.
|
||||||
|
* @return The sub state of the given peer.
|
||||||
|
*/
|
||||||
|
const SubState &
|
||||||
|
MoversightService::getSubState(PeerID id) const {
|
||||||
|
return getPeerState(id).getSubState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the sub state of the given peer.
|
||||||
|
* @param id The peer which sub state shall be set.
|
||||||
|
* @param sub The sub state to set.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::setSubState(PeerID id, const SubState & sub) {
|
||||||
|
getPeerState(id).setSubState(sub);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the state operation of the given peer.
|
||||||
|
* @param id The ID of the peer to read.
|
||||||
|
* @return The state operation of the local peer.
|
||||||
|
*/
|
||||||
|
const StateOperation &
|
||||||
|
MoversightService::getStateOperation(PeerID id) const {
|
||||||
|
return getPeerState(id).getStateOperation();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the state operation of the given peer.
|
||||||
|
* @param id The id of the peer to set.
|
||||||
|
* @param op The state operation to set.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::setStateOperation(PeerID id, const StateOperation & op) {
|
||||||
|
getPeerState(id).setStateOperation(op);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------
|
||||||
|
* Common interface for PDU send operations
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a message to a host identified by it's transport address.
|
||||||
|
* @param msg The message to send.
|
||||||
|
* @param dest The destination's transport address.
|
||||||
|
* @param reliable Whether to send the message reliable or not.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::sendTo(const MoversightMessage& msg, const TransportAddress& dest, const bool reliable /* = false */) {
|
||||||
|
if(getLocalAddress() != dest){
|
||||||
|
dispatcher.getUnicastTransfer().send(msg, dest, reliable);
|
||||||
|
}//End if
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a message to a host identified by it's peer ID.
|
||||||
|
* @param msg The message to send.
|
||||||
|
* @param dest The destination's peer ID.
|
||||||
|
* @param reliable Whether to send the message reliable or not.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::sendTo(const MoversightMessage& msg, const PeerID dest, const bool reliable /* = false */) {
|
||||||
|
TransportAddress ta;
|
||||||
|
if (getLocalSubState() == REJOIN_IN_PROGRESS) {
|
||||||
|
ta = dispatcher.getMembershipService().getLastMemberRegister().getPeer(dest).getLocalAddress();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ta = dispatcher.getMembershipService().getPeer(dest).getLocalAddress();
|
||||||
|
}
|
||||||
|
sendTo(msg, ta, reliable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a message to a list of hosts identified by their transport addresses.
|
||||||
|
* @param msg The message to send.
|
||||||
|
* @param peers List of destination peer IDs.
|
||||||
|
* @param reliable Whether to send the message reliable or not.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::sendTo(const MoversightMessage& msg, const PeerIDList& peers, const bool reliable /* = false */) {
|
||||||
|
for (size_t i = 0; i < peers.size(); i++) {
|
||||||
|
sendTo(msg, peers.get(i), reliable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a message to all peers within this cluster.
|
||||||
|
* @param msg The message to send.
|
||||||
|
* @param reliable Whether to send the message reliable or not.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::sendToCluster(const MoversightMessage& msg, const bool reliable /* = false */) {
|
||||||
|
|
||||||
|
PeerIDList peers = dispatcher.getMembershipService().getClusterPeerIDList(getLocalID());
|
||||||
|
//remove the local peer as receiver of the message
|
||||||
|
peers.remove(getLocalID());
|
||||||
|
|
||||||
|
sendTo(msg, peers, reliable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a message to the master peer.
|
||||||
|
* @param msg The message to send.
|
||||||
|
* @param reliable Whether to send the message reliable or not.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::sendToMaster(const MoversightMessage& msg, const bool reliable /* = false */) {
|
||||||
|
PeerID pid = getLocalPeer().getMasterID();
|
||||||
|
if (getLocalID() != pid) {
|
||||||
|
sendTo(msg, pid, reliable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a message to all master peers.
|
||||||
|
* @param msg The message to send.
|
||||||
|
* @param reliable Whether to send the message reliable or not.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::sendToAllMasters(const MoversightMessage& msg, const bool reliable /* = false */) {
|
||||||
|
PeerIDList peers = dispatcher.getMembershipService().getMasterPeerIDList();
|
||||||
|
peers.remove(getLocalID());
|
||||||
|
sendTo(msg, peers, reliable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a message to a peer from the last view identified by it's peer ID.
|
||||||
|
* @param msg The message to send.
|
||||||
|
* @param dest The destination's peer ID.
|
||||||
|
* @param reliable Whether to send the message reliable or not.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::sendToLastView(const MoversightMessage& msg, const PeerID dest, const bool reliable /* = false */) {
|
||||||
|
TransportAddress ta = dispatcher.getMembershipService().getLastMemberRegister().getPeer(dest).getLocalAddress();
|
||||||
|
sendTo(msg, ta, reliable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a message to a list of peers from the last view identified by their peer ID.
|
||||||
|
* @param msg The message to send.
|
||||||
|
* @param peers List of destination peers.
|
||||||
|
* @param reliable Whether to send the message reliable or not.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MoversightService::sendToLastView(const MoversightMessage& msg, const PeerIDList& peers, const bool reliable /* = false */) {
|
||||||
|
for (size_t i = 0; i < peers.size(); i++) {
|
||||||
|
sendToLastView(msg, peers.get(i), reliable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a list of receiver peers.
|
||||||
|
*
|
||||||
|
* This method creates a list of receiver peers for example a multicast dissemination within the current cluster.
|
||||||
|
* The generated list contains all peers of the local cluster and all master, expect it self and the peer, which was the sender of the message.
|
||||||
|
* The sender of the message is given by the sourcePeerId attribute (in common stored in the last hop field of a peer message).
|
||||||
|
*
|
||||||
|
* @param sourcePeerID The sender of a message. Normally identified by the last hop / or sender field of a peer message.
|
||||||
|
* @return The created list.
|
||||||
|
*/
|
||||||
|
PeerIDList
|
||||||
|
MoversightService::createReceiverList(PeerID sourcePeerID) {
|
||||||
|
|
||||||
|
PeerIDList recList;
|
||||||
|
|
||||||
|
//sender is master
|
||||||
|
if (dispatcher.getMembershipService().getMasterPeerIDList().contains(sourcePeerID)) {
|
||||||
|
|
||||||
|
recList = dispatcher.getMembershipService().getClusterPeerIDList(getLocalID());
|
||||||
|
|
||||||
|
}
|
||||||
|
//sender is slave
|
||||||
|
else {
|
||||||
|
|
||||||
|
recList = dispatcher.getMembershipService().getClusterAndMasterPeerIDList(getLocalPeer());
|
||||||
|
recList.remove(sourcePeerID);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
recList.remove(getLocalID());
|
||||||
|
return recList;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assignment operator
|
||||||
|
* @param other The instance to assign.
|
||||||
|
* @return A reference to the local instance.
|
||||||
|
*/
|
||||||
|
MoversightService &
|
||||||
|
MoversightService::operator=(const MoversightService & other) {
|
||||||
|
|
||||||
|
//prevent self assignment
|
||||||
|
if (this == &other) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatcher = other.dispatcher;
|
||||||
|
module = other.module;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Permits access to the current logical time.
|
||||||
|
* @return The current logical time.
|
||||||
|
*/
|
||||||
|
const VirtualLogicalTime &
|
||||||
|
MoversightService::getCurrentLogicalTime() const {
|
||||||
|
return dispatcher.getTimeService().getCurrentLogicalTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the last seen logical time for a delivered message.
|
||||||
|
* @return The last seen logical time of a delivered message
|
||||||
|
*/
|
||||||
|
const VirtualLogicalTime &
|
||||||
|
MoversightService::getLastSeenLogicalTime() const {
|
||||||
|
return dispatcher.getMessageTransfer().getLastSeenLogicalTime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
133
uni/masterarbeit/source/moversight/common/MoversightService.h
Normal file
133
uni/masterarbeit/source/moversight/common/MoversightService.h
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* File: MoversightService.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on May 27, 2011, 9:19 AM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MOVERSIGHTSERVICE_H
|
||||||
|
#define MOVERSIGHTSERVICE_H
|
||||||
|
|
||||||
|
#include "common/Defines.h"
|
||||||
|
#include "common/container/PeerList.h"
|
||||||
|
#include "common/container/PeerIDList.h"
|
||||||
|
#include "common/transport/TransportAddress.h"
|
||||||
|
#include "event/ObjectListener.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
class Dispatcher;
|
||||||
|
class Moversight;
|
||||||
|
class MoversightMessage;
|
||||||
|
class NFDMessage;
|
||||||
|
class MoversightTimer;
|
||||||
|
class VirtualLogicalTime;
|
||||||
|
|
||||||
|
class ExteriorMessage;
|
||||||
|
class UnicastMessage;
|
||||||
|
class MulticastMessage;
|
||||||
|
class InteriorMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class MoversightService
|
||||||
|
* @author Jan Gäbler
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @brief Defines a common interface for a moversight module.
|
||||||
|
*/
|
||||||
|
class MoversightService : public ObjectListener {
|
||||||
|
friend class MoversightTimer;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MoversightService(Dispatcher & d, std::string name);
|
||||||
|
|
||||||
|
MoversightService(const MoversightService & other);
|
||||||
|
|
||||||
|
virtual ~MoversightService();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize the service. Called to setup the defined service.
|
||||||
|
*/
|
||||||
|
virtual void initialise() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Finalize the module. Clean and stop the running module service.
|
||||||
|
*/
|
||||||
|
virtual void finalise() = 0;
|
||||||
|
|
||||||
|
MoversightService & operator=(const MoversightService & other);
|
||||||
|
|
||||||
|
virtual const PeerState & getLocalPeerState() const;
|
||||||
|
virtual const State & getLocalState() const;
|
||||||
|
virtual const SubState & getLocalSubState() const;
|
||||||
|
virtual const StateOperation & getLocalStateOperation() const;
|
||||||
|
|
||||||
|
virtual const State & getState(PeerID id) const;
|
||||||
|
virtual const SubState & getSubState(PeerID id) const;
|
||||||
|
virtual const StateOperation & getStateOperation(PeerID id) const;
|
||||||
|
|
||||||
|
virtual const VirtualLogicalTime & getCurrentLogicalTime() const;
|
||||||
|
virtual const VirtualLogicalTime & getLastSeenLogicalTime() const;
|
||||||
|
|
||||||
|
virtual ViewID getViewID() const;
|
||||||
|
virtual ViewID getLastViewID() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual PeerIDList getMasterIDList();
|
||||||
|
|
||||||
|
virtual Peer & getLocalPeer();
|
||||||
|
virtual const Peer & getLocalPeer() const;
|
||||||
|
|
||||||
|
virtual PeerID getLocalID();
|
||||||
|
|
||||||
|
virtual TransportAddress const & getLocalAddress();
|
||||||
|
|
||||||
|
virtual PeerID getLocalMasterID() const;
|
||||||
|
virtual bool isLocalPeerMaster();
|
||||||
|
|
||||||
|
virtual void setLocalState(const State & s);
|
||||||
|
virtual void setLocalSubState(const SubState & sub);
|
||||||
|
virtual void setLocalStateOperation(const StateOperation & op);
|
||||||
|
|
||||||
|
virtual void setState(PeerID id, const State & s);
|
||||||
|
virtual void setSubState(PeerID id, const SubState & sub);
|
||||||
|
virtual void setStateOperation(PeerID id, const StateOperation & op);
|
||||||
|
|
||||||
|
virtual PeerIDList createReceiverList(PeerID sourcePeerID);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Common interface for PDU send operations
|
||||||
|
*/
|
||||||
|
virtual void sendTo(const MoversightMessage& msg, const TransportAddress& dest, const bool reliable = false);
|
||||||
|
virtual void sendTo(const MoversightMessage& msg, const PeerID dest, const bool reliable = false);
|
||||||
|
virtual void sendTo(const MoversightMessage& msg, const PeerIDList& peers, const bool reliable = false);
|
||||||
|
virtual void sendToCluster(const MoversightMessage& msg, const bool reliable = false);
|
||||||
|
virtual void sendToMaster(const MoversightMessage& msg, const bool reliable = false);
|
||||||
|
virtual void sendToAllMasters(const MoversightMessage& msg, const bool reliable = false);
|
||||||
|
virtual void sendToLastView(const MoversightMessage& msg, const PeerID dest, const bool reliable = false);
|
||||||
|
virtual void sendToLastView(const MoversightMessage& msg, const PeerIDList& peers, const bool reliable = false);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* @brief Reference to the moversight dispatcher.
|
||||||
|
*/
|
||||||
|
Dispatcher & dispatcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reference to the moversight module.
|
||||||
|
*/
|
||||||
|
Moversight & module;
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual PeerState & getLocalPeerState();
|
||||||
|
virtual PeerState & getPeerState(PeerID id);
|
||||||
|
virtual const PeerState & getPeerState(PeerID id) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* MOVERSIGHTSERVICE_H */
|
||||||
|
|
||||||
32
uni/masterarbeit/source/moversight/common/Platform.h
Normal file
32
uni/masterarbeit/source/moversight/common/Platform.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
/*
|
||||||
|
* File: Platform.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on September 7, 2010, 3:03 PM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef PLATFORM_H
|
||||||
|
#define PLATFORM_H
|
||||||
|
|
||||||
|
//check for ubeeme core settings
|
||||||
|
#ifdef UBEEME
|
||||||
|
//platform settings done in ubeeme/common/ubeeme_global.h
|
||||||
|
#define OMNETPP 0
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Defines if the current platform is omnetpp or not
|
||||||
|
*/
|
||||||
|
#define OMNETPP 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @breif Disables the ubeeme platform
|
||||||
|
*/
|
||||||
|
#define UBEEME 0
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* PLATFORM_H */
|
||||||
294
uni/masterarbeit/source/moversight/common/Reference.h
Normal file
294
uni/masterarbeit/source/moversight/common/Reference.h
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
/*
|
||||||
|
* File: Reference.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on January 30, 2014, 7:39 PM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef REFERENCE_H
|
||||||
|
#define REFERENCE_H
|
||||||
|
|
||||||
|
#include <serializable.h>
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Provides a basic reference implementation.
|
||||||
|
* @class Reference
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @author Jan Gäbler
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
class Reference : public Serializable {
|
||||||
|
template <typename S>
|
||||||
|
friend std::ostream & operator<<(std::ostream & stream, const Reference<S> & ref);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Reference();
|
||||||
|
|
||||||
|
Reference(const T & value);
|
||||||
|
|
||||||
|
Reference(const Reference<T> & orig);
|
||||||
|
|
||||||
|
virtual ~Reference();
|
||||||
|
|
||||||
|
Reference<T> & operator=(const Reference<T> & rhs);
|
||||||
|
|
||||||
|
Reference<T> operator+(const unsigned int & rhs);
|
||||||
|
|
||||||
|
Reference<T> operator+(const Reference<T> & rhs);
|
||||||
|
|
||||||
|
Reference<T> operator-(const Reference<T> & rhs);
|
||||||
|
|
||||||
|
Reference<T> operator*(const unsigned int & rhs);
|
||||||
|
|
||||||
|
bool operator==(const Reference<T> & rhs) const;
|
||||||
|
|
||||||
|
bool operator!=(const Reference<T> & rhs) const;
|
||||||
|
|
||||||
|
bool operator<(const Reference<T> & rhs) const;
|
||||||
|
|
||||||
|
bool operator>(const Reference<T> & rhs) const;
|
||||||
|
|
||||||
|
|
||||||
|
Reference<T> & operator++(); //++a
|
||||||
|
Reference<T> operator++(int); //a++
|
||||||
|
Reference<T> & operator--(); //--a
|
||||||
|
Reference<T> operator--(int); //a--
|
||||||
|
|
||||||
|
void set(Archive &archive);
|
||||||
|
|
||||||
|
virtual T getValue() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
T value;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T>::Reference() : value(0) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param aValue The initial reference value.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T>::Reference(const T & aValue) : value(aValue) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param orig The instance to copy
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T>::Reference(const Reference<T> & orig) : Serializable(orig) {
|
||||||
|
operator =(orig);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T>::~Reference() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns a integer representation of the current reference instance.
|
||||||
|
* @return A integer representation of the current reference instance.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
T
|
||||||
|
Reference<T>::getValue() const {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Archive method.
|
||||||
|
* @param archive The archive to which the attributes are to add.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
void
|
||||||
|
Reference<T>::set(Archive &archive) {
|
||||||
|
archive(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Addition operation.
|
||||||
|
* @param rhs the value to add
|
||||||
|
* @returns The result of the addition.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T>
|
||||||
|
Reference<T>::operator+(const unsigned int & rhs) {
|
||||||
|
return Reference<T>(value + rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Addition operation.
|
||||||
|
* @param rhs the value to add
|
||||||
|
* @returns The result of the addition.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T>
|
||||||
|
Reference<T>::operator+(const Reference<T> & rhs) {
|
||||||
|
return Reference<T>(value + rhs.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Subtraction operation.
|
||||||
|
* @param rhs the value to add
|
||||||
|
* @returns The result of the subtraction.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T>
|
||||||
|
Reference<T>::operator-(const Reference<T> & rhs) {
|
||||||
|
return Reference<T>(value - rhs.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Multiplication operation.
|
||||||
|
* @param rhs the factor to multiply with
|
||||||
|
* @returns The result of the multiplication.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T>
|
||||||
|
Reference<T>::operator*(const unsigned int & rhs) {
|
||||||
|
return Reference<T>(value * rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assignment operator.
|
||||||
|
* @param rhs The right hand value.
|
||||||
|
* @return A reference to the new created object.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T> &
|
||||||
|
Reference<T>::operator=(const Reference<T> & rhs) {
|
||||||
|
|
||||||
|
if (this == &rhs) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serializable::operator =(rhs);
|
||||||
|
|
||||||
|
value = rhs.value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Less operator.
|
||||||
|
* @param rhs The value to compare.
|
||||||
|
* @return True, if the local value less than the given one, false otherwise.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
bool
|
||||||
|
Reference<T>::operator<(const Reference<T> & rhs) const {
|
||||||
|
return value < rhs.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Greater operator.
|
||||||
|
* @param rhs The value to compare.
|
||||||
|
* @return True, if the local value greater than the given one, false otherwise.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
bool
|
||||||
|
Reference<T>::operator>(const Reference<T> & rhs) const {
|
||||||
|
return value > rhs.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Equality operator.
|
||||||
|
* @param o The object to compare.
|
||||||
|
* @return True, if the given reference the same than the local, false otherwise.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
bool
|
||||||
|
Reference<T>::operator==(const Reference<T> & o) const {
|
||||||
|
return value == o.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Not equal operator.
|
||||||
|
* @param rhs The value to compare.
|
||||||
|
* @return True, if the local reference not equal to the given, false otherwise.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
bool
|
||||||
|
Reference<T>::operator!=(const Reference<T> & rhs) const {
|
||||||
|
return value != rhs.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Increments the reference (++a).
|
||||||
|
* @return A reference to the local instance.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T> &
|
||||||
|
Reference<T>::operator++() {
|
||||||
|
|
||||||
|
value++;
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Increments the reference (a++).
|
||||||
|
* @return The result of the operation.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T>
|
||||||
|
Reference<T>::operator++(int) {
|
||||||
|
|
||||||
|
Reference<T> result(*this);
|
||||||
|
++(*this);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Decrements the reference (--a).
|
||||||
|
* @return A reference to the local instance.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T> &
|
||||||
|
Reference<T>::operator--() {
|
||||||
|
|
||||||
|
value--;
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Decrements the reference (a--).
|
||||||
|
* @return The result of the operation.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
Reference<T>
|
||||||
|
Reference<T>::operator--(int) {
|
||||||
|
|
||||||
|
Reference<T> result(*this);
|
||||||
|
--(*this);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Output operator. Prints a textual representation of the current reference.
|
||||||
|
* @param stream The output stream to print the textual representation.
|
||||||
|
* @param mRef The Reference to print.
|
||||||
|
*/
|
||||||
|
template <typename S>
|
||||||
|
std::ostream & operator<<(std::ostream& stream, const Reference<S> & ref) {
|
||||||
|
return stream << ref.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* REFERENCE_H */
|
||||||
|
|
||||||
338
uni/masterarbeit/source/moversight/common/UbeemeConnector.cc
Normal file
338
uni/masterarbeit/source/moversight/common/UbeemeConnector.cc
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
/*
|
||||||
|
* File: UbeemeConnector.cc
|
||||||
|
* Author: noackrob
|
||||||
|
*
|
||||||
|
* Created on August 12, 2013, 2:48 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "common/UbeemeConnector.h"
|
||||||
|
#include "Moversight.h"
|
||||||
|
#include "Dispatcher.h"
|
||||||
|
|
||||||
|
/** @FIXME There will be a type interference if Ubeeme is enabled. */
|
||||||
|
#if UBEEME
|
||||||
|
#include "core/event/event_container.h"
|
||||||
|
#include "core/event/event_sender.h"
|
||||||
|
|
||||||
|
#include "app/events/GroupMessage.h"
|
||||||
|
#include "app/events/GroupCreatedEvent.h"
|
||||||
|
#include "app/events/GroupClosedEvent.h"
|
||||||
|
#include "app/events/JoinGroupDoneEvent.h"
|
||||||
|
#include "app/events/LocalPeerUpdateEvent.h"
|
||||||
|
#include "app/events/PeerIsPendingEvent.h"
|
||||||
|
#include "app/events/PeerJoinedEvent.h"
|
||||||
|
#include "app/events/PeerLeftEvent.h"
|
||||||
|
#include "app/events/PeerReconnectedEvent.h"
|
||||||
|
#include "app/events/SplitNotifyEvent.h"
|
||||||
|
#include "app/events/SplitDoneEvent.h"
|
||||||
|
#include "app/events/MergeNotifyEvent.h"
|
||||||
|
#include "app/events/MergeDoneEvent.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "event/events/ConnectionLostEvent.h"
|
||||||
|
#include "event/events/ConnectionReEstablishedEvent.h"
|
||||||
|
#include "event/events/FlushStartEvent.h"
|
||||||
|
#include "merge/events/MergeRequestEvent.h"
|
||||||
|
#include "merge/events/MergeConfirmEvent.h"
|
||||||
|
#include "merge/events/MergeRejectedEvent.h"
|
||||||
|
#include "merge/events/MergeAbortEvent.h"
|
||||||
|
#include "merge/events/MergeDoneEvent.h"
|
||||||
|
#include "mob/events/UnableToReconnectToGroupEvent.h"
|
||||||
|
#include "ms/events/GroupCreatedEvent.h"
|
||||||
|
#include "ms/events/GroupClosedEvent.h"
|
||||||
|
#include "ms/events/PeerJoinedEvent.h"
|
||||||
|
#include "ms/events/PeerLeftEvent.h"
|
||||||
|
#include "ms/events/JoinGroupDoneEvent.h"
|
||||||
|
#include "ms/events/LocalPeerUpdatedEvent.h"
|
||||||
|
#include "ms/events/RejoinDoneEvent.h"
|
||||||
|
#include "ms/events/RejoinFailedEvent.h"
|
||||||
|
#include "mt/events/PendingPeersEvent.h"
|
||||||
|
#include "fd/events/PeerReconnectedEvent.h"
|
||||||
|
#include "split/events/SplitDoneEvent.h"
|
||||||
|
#include "split/events/SplitAbortEvent.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#define DEBUG(msg) if (module.isPrintDebugUC()) MOV_DEBUG << "UC@" << dispatcher.getLocalPeer().getPeerID()<< " " << msg << endl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor.
|
||||||
|
*/
|
||||||
|
UbeemeConnector::UbeemeConnector(Dispatcher & dis)
|
||||||
|
: MoversightService(dis, "UbeemeConnector") {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy Constructor.
|
||||||
|
* @param other Service to copy.
|
||||||
|
*/
|
||||||
|
UbeemeConnector::UbeemeConnector(const UbeemeConnector & other)
|
||||||
|
: MoversightService(other) {
|
||||||
|
operator=(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assignment operator
|
||||||
|
* @param other The service to copy.
|
||||||
|
* @return This service with new values.
|
||||||
|
*/
|
||||||
|
UbeemeConnector &
|
||||||
|
UbeemeConnector::operator=(const UbeemeConnector & other) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor.
|
||||||
|
*/
|
||||||
|
UbeemeConnector::~UbeemeConnector() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::initialise() {
|
||||||
|
dispatcher.subscribe<ConnectionLostEvent>(this);
|
||||||
|
dispatcher.subscribe<ConnectionReEstablishedEvent>(this);
|
||||||
|
dispatcher.subscribe<UnableToReconnectToGroupEvent>(this);
|
||||||
|
dispatcher.subscribe<GroupCreatedEvent>(this);
|
||||||
|
dispatcher.subscribe<GroupClosedEvent>(this);
|
||||||
|
dispatcher.subscribe<PeerJoinedEvent>(this);
|
||||||
|
dispatcher.subscribe<PeerLeftEvent>(this);
|
||||||
|
dispatcher.subscribe<PeerReconnectedEvent>(this);
|
||||||
|
dispatcher.subscribe<PendingPeersEvent>(this);
|
||||||
|
dispatcher.subscribe<LocalPeerUpdatedEvent>(this);
|
||||||
|
dispatcher.subscribe<JoinGroupDoneEvent>(this);
|
||||||
|
dispatcher.subscribe<RejoinDoneEvent>(this);
|
||||||
|
dispatcher.subscribe<RejoinFailedEvent>(this);
|
||||||
|
dispatcher.subscribe<FlushStartEvent>(this);
|
||||||
|
dispatcher.subscribe<SplitDoneEvent>(this);
|
||||||
|
dispatcher.subscribe<SplitAbortEvent>(this);
|
||||||
|
dispatcher.subscribe<MergeRequestEvent>(this);
|
||||||
|
dispatcher.subscribe<MergeConfirmEvent>(this);
|
||||||
|
dispatcher.subscribe<MergeRejectedEvent>(this);
|
||||||
|
dispatcher.subscribe<MergeAbortEvent>(this);
|
||||||
|
dispatcher.subscribe<MergeDoneEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Cleanup.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::finalise() {
|
||||||
|
dispatcher.unsubscribeAll(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle ConnectionLostEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const ConnectionLostEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
#pragma message("SIGNAL CONNECTION LOST NOT IMPLEMENTED YET")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle ConnectionReEstablishedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const ConnectionReEstablishedEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
#pragma message("SIGNAL CONNECTION REESTABLISHED NOT IMPLEMENTED YET")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle UnableToReconnectToGroupEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const UnableToReconnectToGroupEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
#pragma message("SIGNAL UNABLE TO RECONNECT TO GROUP NOT IMPLEMENTED YET")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle GroupCreatedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const GroupCreatedEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
EventContainer ev(new GroupCreatedEvent(getLocalPeer()));
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle GroupClosedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const GroupClosedEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
EventContainer ev(new GroupClosedEvent(getLocalPeer()));
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle PeerJoinedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const PeerJoinedEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
EventContainer ev(new PeerJoinedEvent(pId, ta, pDesc));
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle PeerLeftEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const PeerLeftEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
EventContainer ev(new PeerLeftEvent(e->getPeer()));
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle PeerReconnectedEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const PeerReconnectedEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
EventContainer ev(new PeerReconnectedEvent(e->getPeerID(), e->getTransportAddress()));
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle PendingPeersEvent.
|
||||||
|
* @param e The event.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const PendingPeersEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
PeerIDList & pList = e->getPeerIDList();
|
||||||
|
for (size_t i = 0; i < pList.size(); i++) {
|
||||||
|
EventContainer ev(new PeerIsPendingEvent(pList.get(i), getLocalAddressFromPeer(pList.get(i))));
|
||||||
|
sendEvent(ev);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const LocalPeerUpdatedEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
EventContainer ev(new LocalPeerUpdateEvent(e->getPeer()));
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const JoinGroupDoneEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
|
||||||
|
EventContainer ev(new JoinGroupDoneEvent(e->getPeer());
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const RejoinDoneEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
|
||||||
|
EventContainer ev(new RejoinDoneEvent();
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const FlushStartEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
|
||||||
|
EventContainer ev(new FlushStartEvent());
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const SplitDoneEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
|
||||||
|
EventContainer ev(new SplitDoneEvent());
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const SplitAbortEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
#pragma message ("SPLIT ABORT EVENT NOT IMPLEMENTED YET")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const MergeRequestEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
#pragma message ("MERGE REQUEST EVENT NOT IMPLEMENTED YET")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const MergeConfirmEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
#pragma message ("MERGE CONFIRM EVENT NOT IMPLEMENTED YET")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const MergeRejectedEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
#pragma message ("MERGE REJECT EVENT NOT IMPLEMENTED YET")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const MergeAbortEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
#pragma message ("MERGE ABORT EVENT NOT IMPLEMENTED YET")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const MergeDoneEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
|
||||||
|
EventContainer ev(new MergeDoneEvent());
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
UbeemeConnector::handleEvent(const RejoinFailedEvent & e) {
|
||||||
|
#if UBEEME
|
||||||
|
EventContainer ev(new RejoinFailedEvent());
|
||||||
|
sendEvent(ev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
76
uni/masterarbeit/source/moversight/common/UbeemeConnector.h
Normal file
76
uni/masterarbeit/source/moversight/common/UbeemeConnector.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* File: UbeemeConnector.h
|
||||||
|
* Author: noackrob
|
||||||
|
*
|
||||||
|
* Created on August 12, 2013, 2:48 PM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef UBEEMECONNECTOR_H
|
||||||
|
#define UBEEMECONNECTOR_H
|
||||||
|
|
||||||
|
#include "common/MoversightService.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Service to provide access to other ubeeme components via its own event system
|
||||||
|
*
|
||||||
|
* If ubeeme support is enabled, this service will receive every event generated
|
||||||
|
* by internal moversight modules and inform other components within the ubeeme
|
||||||
|
* system.
|
||||||
|
*
|
||||||
|
* @class UbeemeConnector
|
||||||
|
* @author Robert Noack
|
||||||
|
* @ingroup Moversight
|
||||||
|
*/
|
||||||
|
#if OMNETPP
|
||||||
|
|
||||||
|
class UbeemeConnector : public MoversightService {
|
||||||
|
#else
|
||||||
|
|
||||||
|
class UbeemeConnector : public MoversightService, public EventSender {
|
||||||
|
#endif
|
||||||
|
public:
|
||||||
|
UbeemeConnector(Dispatcher & dis);
|
||||||
|
UbeemeConnector(const UbeemeConnector& other);
|
||||||
|
UbeemeConnector& operator=(const UbeemeConnector& other);
|
||||||
|
virtual ~UbeemeConnector();
|
||||||
|
|
||||||
|
virtual void initialise();
|
||||||
|
virtual void finalise();
|
||||||
|
|
||||||
|
virtual void handleEvent(const ConnectionLostEvent& e);
|
||||||
|
virtual void handleEvent(const ConnectionReEstablishedEvent& e);
|
||||||
|
virtual void handleEvent(const UnableToReconnectToGroupEvent& e);
|
||||||
|
|
||||||
|
virtual void handleEvent(const GroupCreatedEvent& e);
|
||||||
|
virtual void handleEvent(const GroupClosedEvent& e);
|
||||||
|
|
||||||
|
virtual void handleEvent(const PeerJoinedEvent& e);
|
||||||
|
virtual void handleEvent(const PeerLeftEvent& e);
|
||||||
|
virtual void handleEvent(const PeerReconnectedEvent& e);
|
||||||
|
virtual void handleEvent(const PendingPeersEvent& e);
|
||||||
|
virtual void handleEvent(const LocalPeerUpdatedEvent& e);
|
||||||
|
|
||||||
|
virtual void handleEvent(const JoinGroupDoneEvent& e);
|
||||||
|
virtual void handleEvent(const RejoinDoneEvent& e);
|
||||||
|
virtual void handleEvent(const RejoinFailedEvent& e);
|
||||||
|
|
||||||
|
virtual void handleEvent(const FlushStartEvent& e);
|
||||||
|
virtual void handleEvent(const SplitDoneEvent& e);
|
||||||
|
virtual void handleEvent(const SplitAbortEvent& e);
|
||||||
|
virtual void handleEvent(const MergeRequestEvent& e);
|
||||||
|
virtual void handleEvent(const MergeConfirmEvent& e);
|
||||||
|
virtual void handleEvent(const MergeRejectedEvent& e);
|
||||||
|
virtual void handleEvent(const MergeAbortEvent& e);
|
||||||
|
virtual void handleEvent(const MergeDoneEvent& e);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* UBEEMECONNECTOR_H */
|
||||||
|
|
||||||
@@ -0,0 +1,389 @@
|
|||||||
|
/*
|
||||||
|
* File: CircularBuffer.h
|
||||||
|
* Author: jgaebler
|
||||||
|
*
|
||||||
|
* Created on October 26, 2012, 1:57 PM
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef CIRCULARBUFFER_H
|
||||||
|
#define CIRCULARBUFFER_H
|
||||||
|
|
||||||
|
#include <boost/circular_buffer.hpp>
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class CircularBuffer
|
||||||
|
* @brief Provides a circular buffer for objects.
|
||||||
|
*
|
||||||
|
* Provides a circular buffer for objects. The circular buffer
|
||||||
|
* should not be used for storing pointers to dynamically allocated objects.
|
||||||
|
* When a circular buffer becomes full, further insertion will overwrite
|
||||||
|
* the stored pointers - resulting in a memory leak. One recommend alternative
|
||||||
|
* is the use of smart pointers.
|
||||||
|
* @ingroup Moversight
|
||||||
|
* @author Jan Gäbler
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
class CircularBuffer {
|
||||||
|
public:
|
||||||
|
|
||||||
|
CircularBuffer(size_t size);
|
||||||
|
CircularBuffer(const CircularBuffer & orig);
|
||||||
|
virtual ~CircularBuffer();
|
||||||
|
|
||||||
|
void add(const T & t);
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
size_t size() const;
|
||||||
|
size_t maxSize() const;
|
||||||
|
|
||||||
|
bool isEmpty() const;
|
||||||
|
bool isFull() const;
|
||||||
|
|
||||||
|
size_t getReserve() const;
|
||||||
|
void resetCapacity(size_t new_capacity);
|
||||||
|
|
||||||
|
size_t getCapacity() const;
|
||||||
|
void setCapacity(size_t new_capacity);
|
||||||
|
|
||||||
|
void resize(size_t new_size);
|
||||||
|
|
||||||
|
void pop();
|
||||||
|
|
||||||
|
T & get(size_t index);
|
||||||
|
T const & get(size_t index) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
typedef boost::circular_buffer<T> CBuffer;
|
||||||
|
CBuffer buffer;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef typename CBuffer::iterator iterator_type;
|
||||||
|
typedef typename CBuffer::const_iterator const_iterator_type;
|
||||||
|
|
||||||
|
iterator_type erase(iterator_type pos);
|
||||||
|
iterator_type erase(iterator_type first, iterator_type last);
|
||||||
|
iterator_type rerase(iterator_type pos);
|
||||||
|
iterator_type rerase(iterator_type first, iterator_type last);
|
||||||
|
|
||||||
|
iterator_type begin();
|
||||||
|
iterator_type end();
|
||||||
|
const_iterator_type begin() const;
|
||||||
|
const_iterator_type end() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
std::ostream operator<<(std::ostream & s, typename CircularBuffer<T>::iterator_type it){
|
||||||
|
return s<<*it;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
* @param size the size of the circular buffer.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
CircularBuffer<T>::CircularBuffer(size_t size) : buffer(size) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy constructor
|
||||||
|
* @param orig the list to copy
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
CircularBuffer<T>::CircularBuffer(const CircularBuffer & orig) : buffer(orig.buffer) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
CircularBuffer<T>::~CircularBuffer() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clears the buffer
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
void
|
||||||
|
CircularBuffer<T>::clear() {
|
||||||
|
buffer.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a object to the buffer
|
||||||
|
* @param t the object to add
|
||||||
|
* @return This list.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
void
|
||||||
|
CircularBuffer<T>::add(const T & t) {
|
||||||
|
buffer.push_back(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the number of elements currently stored in the circular buffer.
|
||||||
|
* @returns The number of elements currently stored in the buffer.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
size_t
|
||||||
|
CircularBuffer<T>::size() const {
|
||||||
|
return buffer.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the largest possible size or capacity of the circular buffer.
|
||||||
|
* @returns The largest possible size or capacity of the circular buffer.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
size_t
|
||||||
|
CircularBuffer<T>::maxSize() const {
|
||||||
|
return buffer.max_size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Is the circular buffer empty?
|
||||||
|
* @returns True if there are no elements stored in the buffer; False otherwise.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
bool
|
||||||
|
CircularBuffer<T>::isEmpty() const {
|
||||||
|
return buffer.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Is the circular buffer full?
|
||||||
|
* @returns True if the number of elements stored in the buffer equals the capacity of the buffer; false otherwise.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
bool
|
||||||
|
CircularBuffer<T>::isFull() const {
|
||||||
|
return buffer.full();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the maximum number of elements which can be inserted into
|
||||||
|
* the buffer without overwriting any of already stored elements.
|
||||||
|
* @returns getCapacity() - size()
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
size_t
|
||||||
|
CircularBuffer<T>::getReserve() const {
|
||||||
|
return buffer.reserve();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Change the capacity of the buffer.
|
||||||
|
* Effect: getCapacity() == new_capacity && size() <= new_capacity
|
||||||
|
* If the current number of elements stored in the buffer is greater
|
||||||
|
* than the desired new capacity then number of [size() - new_capacity]
|
||||||
|
* first elements will be removed and the new size will be equal to new_capacity.
|
||||||
|
* @param new_capacity The new capacity.
|
||||||
|
* @throw An allocation error if memory is exhausted.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
void
|
||||||
|
CircularBuffer<T>::resetCapacity(size_t new_capacity) {
|
||||||
|
buffer.rset_capacity(new_capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the capacity of the buffer.
|
||||||
|
* @returns The maximum number of elements which can be stored in the buffer.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
size_t
|
||||||
|
CircularBuffer<T>::getCapacity() const {
|
||||||
|
return buffer.capacity();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Change the capacity of the circular_buffer.
|
||||||
|
* Effect: getCapacity() == new_capacity && size() <= new_capacity
|
||||||
|
* If the current number of elements stored in the buffer is greater
|
||||||
|
* than the desired new capacity then number of [size() - new_capacity]
|
||||||
|
* last elements will be removed and the new size will be equal to new_capacity.
|
||||||
|
*
|
||||||
|
* @param new_capacity The new capacity.
|
||||||
|
* @throw An allocation error if memory is exhausted
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
void
|
||||||
|
CircularBuffer<T>::setCapacity(size_t new_capacity) {
|
||||||
|
buffer.set_capacity(new_capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Change the size of the buffer.
|
||||||
|
* Effect: size() == new_size && getCapacity() >= new_size
|
||||||
|
*
|
||||||
|
* If the new size is greater than the current size, copies of item will
|
||||||
|
* be inserted at the back of the of the buffer in order to
|
||||||
|
* achieve the desired size. In the case the resulting size exceeds the
|
||||||
|
* current capacity the capacity will be set to new_size.
|
||||||
|
*
|
||||||
|
* If the current number of elements stored in the buffer is greater
|
||||||
|
* than the desired new size then number of [size() - new_size] last
|
||||||
|
* elements will be removed. (The capacity will remain unchanged.)
|
||||||
|
*
|
||||||
|
* @param new_size The new size.
|
||||||
|
* @throw An allocation error if memory is exhausted.
|
||||||
|
**/
|
||||||
|
template <typename T>
|
||||||
|
void
|
||||||
|
CircularBuffer<T>::resize(size_t new_size) {
|
||||||
|
buffer.resize(new_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pops the first element from the buffer.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
void
|
||||||
|
CircularBuffer<T>::pop() {
|
||||||
|
buffer.pop_front();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the object from the buffer, which is located at the given index.
|
||||||
|
* @throws IndexOutOfBounceException if the given index larger than the current size of the buffer
|
||||||
|
* @param index the index of the element to return
|
||||||
|
* @return the desired element
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
T &
|
||||||
|
CircularBuffer<T>::get(size_t index) {
|
||||||
|
if (index > buffer.size()) {
|
||||||
|
throw IndexOutOfBounceException("index out of bounce");
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
return buffer[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the object from the buffer, which is located at the given index.
|
||||||
|
* @throws IndexOutOfBounceException if the given index larger than the current size of the buffer
|
||||||
|
* @param index the index of the element to return
|
||||||
|
* @return the desired element
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
T const &
|
||||||
|
CircularBuffer<T>::get(size_t index) const {
|
||||||
|
if (index > buffer.size()) {
|
||||||
|
throw IndexOutOfBounceException("index out of bounce");
|
||||||
|
}//End if
|
||||||
|
|
||||||
|
return buffer[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the iterator pointing to the beginning of the buffer.
|
||||||
|
* @return A random access iterator pointing to the first element of the
|
||||||
|
* buffer. If the buffer is empty it returns an iterator equal to the
|
||||||
|
* one returned by end().
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
typename CircularBuffer<T>::iterator_type
|
||||||
|
CircularBuffer<T>::begin() {
|
||||||
|
return buffer.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the const iterator pointing to the beginning of the buffer.
|
||||||
|
* @return A const random access iterator pointing to the first element of the
|
||||||
|
* buffer. If the buffer is empty it returns an iterator equal to the
|
||||||
|
* one returned by end() const.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
typename CircularBuffer<T>::const_iterator_type
|
||||||
|
CircularBuffer<T>::begin() const {
|
||||||
|
return buffer.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the iterator pointing to the end of the buffer.
|
||||||
|
* @return A random access iterator pointing to the element "one behind"
|
||||||
|
* the last element of the buffer. If the buffer is empty it returns an
|
||||||
|
* iterator equal to the one returned by begin().
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
typename CircularBuffer<T>::iterator_type
|
||||||
|
CircularBuffer<T>::end() {
|
||||||
|
return buffer.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the const iterator pointing to the end of the buffer.
|
||||||
|
* @return A const random access iterator pointing to the element "one behind"
|
||||||
|
* the last element of the buffer. If the buffer is empty it returns an
|
||||||
|
* iterator equal to the one returned by begin() const.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
typename CircularBuffer<T>::const_iterator_type
|
||||||
|
CircularBuffer<T>::end() const {
|
||||||
|
return buffer.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Remove an element at the specified position. Precondition:
|
||||||
|
* pos is a valid iterator pointing to the buffer (but not an end()).
|
||||||
|
* @param pos An iterator pointing at the element to be removed.
|
||||||
|
* @return Iterator to the first element remaining beyond the removed
|
||||||
|
* element or end() if no such element exists.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
typename CircularBuffer<T>::iterator_type
|
||||||
|
CircularBuffer<T>::erase(iterator_type pos){
|
||||||
|
return buffer.erase(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Erase the range [first, last). Precondition: Valid range [first, last).
|
||||||
|
* @param first The beginning of the range to be removed.
|
||||||
|
* @param last The end of the range to be removed.
|
||||||
|
* @return Iterator to the first element remaining beyond the removed
|
||||||
|
* elements or end() if no such element exists.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
typename CircularBuffer<T>::iterator_type
|
||||||
|
CircularBuffer<T>::erase(iterator_type first, iterator_type last){
|
||||||
|
return buffer.erase(first, last);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Remove an element at the specified position. Precondition:
|
||||||
|
* pos is a valid iterator pointing to the buffer (but not an end()).
|
||||||
|
* @param pos An iterator pointing at the element to be removed.
|
||||||
|
* @return Iterator to the first element remaining in front of the
|
||||||
|
* removed element or begin() if no such element exists.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
typename CircularBuffer<T>::iterator_type
|
||||||
|
CircularBuffer<T>::rerase(iterator_type pos){
|
||||||
|
return buffer.rerase(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Erase the range [first, last). Precondition: Valid range [first, last).
|
||||||
|
* @param first The beginning of the range to be removed.
|
||||||
|
* @param last The end of the range to be removed.
|
||||||
|
* @return Iterator to the first element remaining in front of the
|
||||||
|
* removed elements or begin() if no such element exists.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
typename CircularBuffer<T>::iterator_type
|
||||||
|
CircularBuffer<T>::rerase(iterator_type first, iterator_type last){
|
||||||
|
return buffer.rerase(first, last);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CIRCULARBUFFER_H */
|
||||||
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include "common/container/GroupList.h"
|
||||||
|
|
||||||
|
namespace ubeeme {
|
||||||
|
namespace moversight {
|
||||||
|
|
||||||
|
std::ostream&
|
||||||
|
operator<<( std::ostream & out, const GroupList l) {
|
||||||
|
out << "[";
|
||||||
|
if( !l.empty()) {
|
||||||
|
out << *(l.begin());
|
||||||
|
for( auto i = (++l.begin()); i != l.end(); i++) {
|
||||||
|
out << ", " << *i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out << "]";
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user