From b3e0975eaa132bbe5baebbd6bf8d3e51c3b2ba0f Mon Sep 17 00:00:00 2001
From: leberr <robin.leber@student.reutlingen-university.de>
Date: Wed, 31 Jan 2024 13:23:30 +0100
Subject: [PATCH] leader election funktioniert

---
 server.py | 135 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 73 insertions(+), 62 deletions(-)

diff --git a/server.py b/server.py
index 34ced50..b97200e 100644
--- a/server.py
+++ b/server.py
@@ -17,7 +17,7 @@ SERVER_MULTICAST_PORT = 5974
 CLIENT_MULTICAST_PORT = 5973
 
 # Listening port ring
-RING_PORT = 10001
+RING_PORT = 5972
 
 # Local host information
 MY_HOST = socket.gethostname()
@@ -50,7 +50,7 @@ class Server():
         # if my IP is not in the server list add it
         if MY_IP not in self.serverList:
             self.serverList.append(MY_IP)
-            self.basic_lcr()
+            
 
         # create socket bind to server address
         multicast_listen_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
@@ -75,7 +75,7 @@ class Server():
 
                     if newServer_address not in self.serverList:
                         self.serverList.append(newServer_address)
-                        self.basic_lcr()
+                        
 
                     reply_message = MY_IP
                     multicast_listen_sock.sendto(str.encode(reply_message), address)
@@ -86,7 +86,6 @@ class Server():
 
                 time.sleep(1)
                 self.print_group_view()
-                # self.basic_lcr()
                 # self.printwt(f'The current leader IP is: {self.leader_uuid}')
             
 
@@ -109,7 +108,7 @@ class Server():
         # if my IP is not in the server list add it
         if MY_IP not in self.serverList:
             self.serverList.append(MY_IP)
-            self.basic_lcr()
+            
         
         # listen for IPs from existing servers
         maxLoop = 5
@@ -136,7 +135,6 @@ class Server():
                         # if reply address is not in the server list, add it
                         if reply_address not in self.serverList:
                             self.serverList.append(reply_address)
-                            self.basic_lcr()
 
                         # Erhöhe die Anzahl der eingehenden Antworten
                         num_responses += 1
@@ -208,65 +206,78 @@ class Server():
                 self.clients.remove(client)
     
     def basic_lcr(self):
+        time.sleep(3)
         # bind to ring socket
         ring_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-        ring_socket.bind((MY_IP, RING_PORT))
-        print('++++++++++++++++++++++++++')
-        print('New leader election starts')
-        print('sending first leader election message to neighbour')
-
-        print('Servers')
-        print(self.serverList)
-
-        neighbour = get_neighbour(form_ring(self.serverList), MY_IP, 'left')
-        neighbour_address = (neighbour, RING_PORT) 
-        first_message = {
-            "mid": self.uuid,
-            "isLeader ": False
-        }
-        self.participant = True
-        ring_socket.sendto(json.dumps(first_message).encode('utf-8'), neighbour_address)
-
-        print('Neighbour')
-        print(neighbour)
-
-        print('\nWaiting to receive election message...\n')
-        data, address = ring_socket.recvfrom(1024)
-        election_message = json.loads(data.decode())
-        print('There is a election message')
-        print(election_message)
-
-        if election_message.get('isLeader'):
-            print('1: leader info weitergeben')
-            self.leader_uuid = election_message['mid']
-            # forward received election message to left neighbour
-            self.participant = False
-            ring_socket.sendto(json.dumps(election_message), neighbour)
-        if election_message.get('mid') < self.uuid and not self.participant:
-            print('2: mich vorschlagen')
-            new_election_message = {
+        try:
+            ring_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+            ring_socket.bind((MY_IP, RING_PORT))
+            print('++++++++++++++++++++++++++')
+            print('New leader election starts')
+            print('sending first leader election message to neighbour')
+
+            print('Servers')
+            print(self.serverList)
+
+            neighbour = get_neighbour(form_ring(self.serverList), MY_IP, 'left')
+            neighbour_address = (neighbour, RING_PORT) 
+            first_message = {
                 "mid": self.uuid,
-                "isLeader ": False
+                "isLeader": False
             }
             self.participant = True
-            # send received election message to left neighbour
-            ring_socket.sendto(json.dumps(new_election_message), neighbour)
-        elif election_message.get('mid') > self.uuid:
-            # send received election message to left neighbour
-            print('3: Jemand anderes vorschlagen')
-            self.participant = True
-            ring_socket.sendto(json.dumps(election_message), neighbour)
-        elif election_message.get('mid') == self.uuid:
-            print('4: Ich wurde als Leader definiert')
-            self.leader_uid = self.uuid
-            self.isLeader = True
-            new_election_message = {
-                "mid": self.uuid,
-                "isLeader ": True
-            }
-        # send new election message to left neighbour
-        self.participant = False
-        ring_socket.sendto(json.dumps(new_election_message).encode('utf-8'), neighbour_address)
+            ring_socket.sendto(json.dumps(first_message).encode('utf-8'), neighbour_address)
+
+            print('Neighbour')
+            print(neighbour)
+            
+            while True:
+                neighbour = get_neighbour(form_ring(self.serverList), MY_IP, 'left')
+                neighbour_address = (neighbour, RING_PORT) 
+
+                print('\nWaiting to receive election message...\n')
+                data, address = ring_socket.recvfrom(1024)
+                election_message = json.loads(data.decode())
+                print('There is a election message')
+                print(election_message)
+
+                if election_message.get('isLeader') and self.participant:
+                    print('1: leader info weitergeben')
+                    self.leader_uuid = election_message['mid']
+                    # forward received election message to left neighbour
+                    self.participant = False
+                    ring_socket.sendto(json.dumps(election_message).encode('utf-8'), neighbour_address)
+                elif election_message.get('mid') < self.uuid and not self.participant:
+                    print('2: mich vorschlagen')
+                    new_election_message = {
+                        "mid": self.uuid,
+                        "isLeader": False
+                    }
+                    self.participant = True
+                    # send received election message to left neighbour
+                    ring_socket.sendto(json.dumps(new_election_message).encode('utf-8'), neighbour_address)
+                elif election_message.get('mid') > self.uuid:
+                    # send received election message to left neighbour
+                    print('3: Jemand anderes vorschlagen')
+                    self.participant = True
+                    ring_socket.sendto(json.dumps(election_message).encode('utf-8'), neighbour_address)
+                elif election_message.get('mid') == self.uuid and self.participant:
+                    print('4: Ich wurde als Leader definiert')
+                    self.leader_uid = self.uuid
+                    self.isLeader = True
+                    new_election_message = {
+                        "mid": self.uuid,
+                        "isLeader": True
+                    }
+                    # send new election message to left neighbour
+                    self.participant = False
+                    ring_socket.sendto(json.dumps(new_election_message).encode('utf-8'), neighbour_address)
+                elif election_message.get('isLeader') and not self.participant:
+                    print('5: Leader ist gewählt, Nachricht wurde schon weiteregeben, ELECTION beenden')
+        except Exception as e:
+            print(f"An error occurred: {e}")
+        finally:
+            ring_socket.close()
 
 
 # starting all simultaneously working procedures
@@ -282,8 +293,8 @@ if __name__== '__main__':
     thread1 = threading.Thread(target = server.ListenForClientAndReply)
     thread1.start()
 
-    # thread_election = threading.Thread(target = server.basic_lcr)
-    # thread_election.start()
+    thread_election = threading.Thread(target = server.basic_lcr)
+    thread_election.start()
     
 
     # server.basic_lcr()
-- 
GitLab