From 11cc00f6b3e2f449a307c2e96072cb1f69edf548 Mon Sep 17 00:00:00 2001
From: Katharina <katharina.willig@outlook.com>
Date: Tue, 10 Dec 2024 22:40:00 +0100
Subject: [PATCH] thread event
---
kclient.py | 1 +
server.py | 25 ++++++++++++++++++-------
2 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/kclient.py b/kclient.py
index 3650707..833815a 100644
--- a/kclient.py
+++ b/kclient.py
@@ -56,6 +56,7 @@ def sender():
#print("send message to", broadcast_port)
#checks for whitemarks
if message.strip():
+
full_message = f"{message_id}: {nickname}: {message}".encode()
client_socket.sendto(full_message, (broadcast_ip, broadcast_port))
#print("message sended to", broadcast_port)
diff --git a/server.py b/server.py
index 8e23e62..613bfbe 100644
--- a/server.py
+++ b/server.py
@@ -1,3 +1,7 @@
+##########unsicher, ob heartbeat funktioniert################
+###########deutsch englisch korrigieren###################
+################liste mit message ids auf 3-5 setzen########
+
import socket
import multiprocessing
import uuid
@@ -82,7 +86,7 @@ def listen_client(shared_data):
#global received_messages
received_messages = set()
-
+
#save_last_messages = manager.dict()
#message_queue = multiprocessing.Queue(maxsize=3)
@@ -196,7 +200,9 @@ def start_election(queue, shared_data):
elif "LEADER" in message:
leader_uuid = message.split(": ")[1]
shared_data['current_leader'] = leader_uuid
+ #time.sleep(1) # Delay to ensure all processes are aware of the leader
print(f"(leader) Leader elected: {shared_data['current_leader']}")
+ leader_election_done.set() # Signal, dass die Leaderwahl abgeschlossen ist
return
except multiprocessing.queues.Empty:
@@ -230,12 +236,17 @@ def start_election(queue, shared_data):
# Heartbeat function
def send_heartbeat(shared_data):
"""Sends heartbeat messages to keep the server active."""
+ leader_election_done.wait() # Blockiert, bis die Leaderwahl abgeschlossen ist
+ print(f"Heartbeat function started. Leader: {shared_data['current_leader']}, Server ID: {shared_data['server_id']}")
#only if you are the current leader
if shared_data['current_leader'] == shared_data['server_id']:
- time.sleep(30) #waiting for leader election #set to 20s
+ #time.sleep(10) #waiting for leader election #set to 20s
while True:
- broadcast_election(f"HEARTBEAT: {shared_data['server_id']}") #please change that to right neighbour after correct leader election
- time.sleep(5)
+ try:
+ broadcast_election(f"HEARTBEAT: {shared_data['server_id']}") #please change that to right neighbour after correct leader election
+ time.sleep(5)
+ except socket.error as e:
+ print(f"Failed to send heartbeat: {e}")
# Monitor heartbeats
def monitor_heartbeats():
@@ -255,6 +266,7 @@ if __name__ == "__main__":
multiprocessing.freeze_support()
print(f"Script started with PID: {os.getpid()}")
+ leader_election_done = threading.Event()
# Manager for shared data
manager = Manager()
@@ -274,14 +286,13 @@ if __name__ == "__main__":
#listener_election_process = multiprocessing.Process(target=listen_broadcast_election, args=(message_queue, shared_data))
listener_client_process = multiprocessing.Process(target=listen_client, args=(shared_data,))
election_process = multiprocessing.Process(target=start_election, args=(message_queue, shared_data))
+ # Start the listener for clients in a thread
+ listener_election_thread = threading.Thread(target=listen_broadcast_election, args=(message_queue, shared_data), daemon=True)
# Heartbeat threads
heartbeat_thread = threading.Thread(target=send_heartbeat, args=(shared_data,), daemon=True)
heartbeat_monitor_thread = threading.Thread(target=monitor_heartbeats, daemon=True)
- # Start the listener for clients in a thread
- listener_election_thread = threading.Thread(target=listen_broadcast_election, args=(message_queue, shared_data), daemon=True)
-
# Start processes and threads
#listener_election_process.start()
listener_client_process.start()
--
GitLab