Bug fixes

This commit is contained in:
2025-11-02 12:50:21 +01:00
parent ba34102453
commit d267c0760e
+35 -9
View File
@@ -139,6 +139,8 @@ struct Process {
int num_allocs; int num_allocs;
Allocation allocs[MAX_ALLOCATIONS]; Allocation allocs[MAX_ALLOCATIONS];
Time wakeup_time;
bool leader; bool leader;
union { union {
ChunkServer chunk_server; ChunkServer chunk_server;
@@ -149,9 +151,7 @@ struct Process {
static int num_processes = 0; static int num_processes = 0;
static Process *processes[MAX_PROCESSES]; static Process *processes[MAX_PROCESSES];
static Process *current_process = NULL; static Process *current_process = NULL;
static uint64_t current_time = 1;
// Simulated clock for deterministic time
static struct timespec simulated_time = {0, 0};
// Helper to set socket errors correctly on Windows vs Linux // Helper to set socket errors correctly on Windows vs Linux
#ifdef _WIN32 #ifdef _WIN32
@@ -235,6 +235,12 @@ static bool is_space(char c)
return c == ' ' || c == '\t' || c == '\r' || c == '\n'; return c == ' ' || c == '\t' || c == '\r' || c == '\n';
} }
void startup_simulation(void)
{
num_processes = 0;
current_process = NULL;
}
int spawn_simulated_process(char *args) int spawn_simulated_process(char *args)
{ {
if (num_processes == MAX_PROCESSES) if (num_processes == MAX_PROCESSES)
@@ -246,6 +252,7 @@ int spawn_simulated_process(char *args)
return -1; return -1;
memcpy(mem, args, args_len); memcpy(mem, args, args_len);
mem[args_len] = '\0'; mem[args_len] = '\0';
args = mem;
int argc = 0; int argc = 0;
char *argv[MAX_ARGS]; char *argv[MAX_ARGS];
@@ -277,18 +284,29 @@ int spawn_simulated_process(char *args)
process->num_desc = 0; process->num_desc = 0;
process->num_allocs = 0; process->num_allocs = 0;
for (int i = 0; i < MAX_DESCRIPTORS; i++)
process->desc[i].type = DESC_EMPTY;
void *contexts[MAX_CONNS+1]; void *contexts[MAX_CONNS+1];
struct pollfd polled[MAX_CONNS+1]; struct pollfd polled[MAX_CONNS+1];
int num_polled; int num_polled;
current_process = process;
int timeout = -1;
if (leader) { if (leader) {
num_polled = metadata_server_init(&process->metadata_server, argc, argv, contexts, polled); num_polled = metadata_server_init(&process->metadata_server, argc, argv, contexts, polled, &timeout);
} else { } else {
num_polled = chunk_server_init(&process->chunk_server, argc, argv, contexts, polled); num_polled = chunk_server_init(&process->chunk_server, argc, argv, contexts, polled, &timeout);
} }
current_process = NULL;
if (num_polled < 0) { if (num_polled < 0) {
// TODO // TODO
} }
if (timeout < 0) {
process->wakeup_time = INVALID_TIME;
} else {
process->wakeup_time = current_time + timeout;
}
process_poll_array(process, contexts, polled, num_polled); process_poll_array(process, contexts, polled, num_polled);
@@ -442,12 +460,14 @@ static int data_queue_write(DataQueue *queue, char *src, int len)
void update_simulation(void) void update_simulation(void)
{ {
// TODO: sort processes based on their wakeup time
for (int i = 0; i < num_processes; i++) { for (int i = 0; i < num_processes; i++) {
current_process = processes[i]; current_process = processes[i];
void *contexts[MAX_CONNS+1]; void *contexts[MAX_CONNS+1];
struct pollfd polled[MAX_CONNS+1]; struct pollfd polled[MAX_CONNS+1];
int num_polled; int num_polled = 0;
for (int j = 0, k = 0; k < current_process->num_desc; j++) { for (int j = 0, k = 0; k < current_process->num_desc; j++) {
@@ -470,16 +490,23 @@ void update_simulation(void)
} }
} }
int timeout = -1;
if (current_process->leader) { if (current_process->leader) {
num_polled = metadata_server_step(&current_process->metadata_server, contexts, polled, num_polled); num_polled = metadata_server_step(&current_process->metadata_server, contexts, polled, num_polled, &timeout);
} else { } else {
num_polled = chunk_server_step(&current_process->chunk_server, contexts, polled, num_polled); num_polled = chunk_server_step(&current_process->chunk_server, contexts, polled, num_polled, &timeout);
} }
if (num_polled < 0) { if (num_polled < 0) {
// TODO // TODO
} }
if (timeout < 0) {
current_process->wakeup_time = INVALID_TIME;
} else {
current_process->wakeup_time = current_time + timeout;
}
process_poll_array(current_process, contexts, polled, num_polled); process_poll_array(current_process, contexts, polled, num_polled);
current_process = NULL; current_process = NULL;
@@ -688,7 +715,6 @@ SOCKET mock_accept(SOCKET fd, void *addr, socklen_t *addr_len)
Descriptor *peer = handle_to_desc(peer_handle); Descriptor *peer = handle_to_desc(peer_handle);
if (peer == NULL) { if (peer == NULL) {
// Peer closed without removing itself from the accept queue! // Peer closed without removing itself from the accept queue!
// Try next connection in queue
SET_SOCKET_ERROR(SOCKET_ERROR_CONNABORTED); // Connection aborted SET_SOCKET_ERROR(SOCKET_ERROR_CONNABORTED); // Connection aborted
return INVALID_SOCKET; return INVALID_SOCKET;
} }