From 14eb3c8ff4bdd121c82d13beb242bc5e6df86a69 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Tue, 3 Mar 2026 19:31:18 +0100 Subject: [PATCH] Reorganize tests: smoke-tests, fault-inject, unit-tests --- test_deadlock_forced | Bin 0 -> 21408 bytes tests/fault-inject/test_deadlock_forced.c | 116 ++++++++++++++++++ tests/fault-inject/test_new_code | Bin 0 -> 20944 bytes tests/fault-inject/test_new_code.c | 83 +++++++++++++ tests/fault-inject/test_old | Bin 0 -> 21192 bytes tests/fault-inject/test_old_aggressive | Bin 0 -> 21232 bytes tests/fault-inject/test_old_aggressive.c | 81 ++++++++++++ .../{ => smoke-tests}/smoke-test-pfs-locks.sh | 0 8 files changed, 280 insertions(+) create mode 100755 test_deadlock_forced create mode 100644 tests/fault-inject/test_deadlock_forced.c create mode 100755 tests/fault-inject/test_new_code create mode 100644 tests/fault-inject/test_new_code.c create mode 100755 tests/fault-inject/test_old create mode 100755 tests/fault-inject/test_old_aggressive create mode 100644 tests/fault-inject/test_old_aggressive.c rename tests/{ => smoke-tests}/smoke-test-pfs-locks.sh (100%) diff --git a/test_deadlock_forced b/test_deadlock_forced new file mode 100755 index 0000000000000000000000000000000000000000..8b1963e69fd86caa2e19a807336d1d5e4a8e7636 GIT binary patch literal 21408 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 D$iP8D literal 0 HcmV?d00001 diff --git a/tests/fault-inject/test_deadlock_forced.c b/tests/fault-inject/test_deadlock_forced.c new file mode 100644 index 0000000..7b8ec96 --- /dev/null +++ b/tests/fault-inject/test_deadlock_forced.c @@ -0,0 +1,116 @@ +/* + * Fault injection test: Force lock ordering violation in old code + * + * This test uses strategic delays to force the deadlock scenario: + * Thread 1: holds psql, tries file mutex + * Thread 2: holds file mutex, tries psql + */ + +#include +#include +#include +#include + +typedef struct { + pthread_mutex_t mutex; +} psync_openfile_t; + +static pthread_mutex_t psql_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_barrier_t barrier; + +static void psql_lock() { pthread_mutex_lock(&psql_mutex); } +static void psql_unlock() { pthread_mutex_unlock(&psql_mutex); } +static int psql_trylock() { return pthread_mutex_trylock(&psql_mutex); } + +// OLD implementation with retry loop +static void pfs_get_both_locks_OLD(psync_openfile_t *of) { +retry: + psql_lock(); + if (pthread_mutex_trylock(&of->mutex)) { + psql_unlock(); + pthread_mutex_lock(&of->mutex); + if (psql_trylock()) { + pthread_mutex_unlock(&of->mutex); + usleep(1000); + goto retry; + } + } +} + +static void *thread1_func(void *arg) { + psync_openfile_t *of = arg; + + // T1: Acquire psql first + psql_lock(); + printf("T1: acquired psql\n"); + + // Wait for T2 to acquire file mutex + pthread_barrier_wait(&barrier); + usleep(10000); + + // T1: Try to acquire file mutex (will block - T2 holds it) + printf("T1: trying file mutex...\n"); + pthread_mutex_lock(&of->mutex); + printf("T1: acquired file mutex\n"); + + pthread_mutex_unlock(&of->mutex); + psql_unlock(); + return NULL; +} + +static void *thread2_func(void *arg) { + psync_openfile_t *of = arg; + + // T2: Acquire file mutex first + pthread_mutex_lock(&of->mutex); + printf("T2: acquired file mutex\n"); + + // Signal T1 we have the file mutex + pthread_barrier_wait(&barrier); + usleep(10000); + + // T2: Try to acquire psql (will block - T1 holds it) + printf("T2: trying psql...\n"); + psql_lock(); + printf("T2: acquired psql\n"); + + psql_unlock(); + pthread_mutex_unlock(&of->mutex); + return NULL; +} + +int main() { + psync_openfile_t of; + pthread_mutex_init(&of.mutex, NULL); + pthread_barrier_init(&barrier, NULL, 2); + + printf("=== Testing OLD lock ordering (deadlock scenario) ===\n"); + + pthread_t t1, t2; + pthread_create(&t1, NULL, thread1_func, &of); + pthread_create(&t2, NULL, thread2_func, &of); + + // Wait with timeout + sleep(5); + + // Check if threads are still running (deadlocked) + void *ret1, *ret2; + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += 1; + + int r1 = pthread_timedjoin_np(t1, &ret1, &ts); + int r2 = pthread_timedjoin_np(t2, &ret2, &ts); + + if (r1 != 0 || r2 != 0) { + printf("\nDEADLOCK CONFIRMED: threads hung with opposite lock ordering\n"); + pthread_cancel(t1); + pthread_cancel(t2); + return 1; + } + + pthread_mutex_destroy(&of.mutex); + pthread_barrier_destroy(&barrier); + printf("\nPASS: no deadlock (unexpected)\n"); + return 0; +} diff --git a/tests/fault-inject/test_new_code b/tests/fault-inject/test_new_code new file mode 100755 index 0000000000000000000000000000000000000000..92e35f57659f746431814104c0274c34382d6ad8 GIT binary patch literal 20944 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 Qi8LQvXM4rU9LhxT@6Jsa-~a#s literal 0 HcmV?d00001 diff --git a/tests/fault-inject/test_new_code.c b/tests/fault-inject/test_new_code.c new file mode 100644 index 0000000..5c0d69d --- /dev/null +++ b/tests/fault-inject/test_new_code.c @@ -0,0 +1,83 @@ +/* + * Fault injection test: Verify NEW code prevents deadlock + * + * Same scenario as forced deadlock test, but with new lock ordering. + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +typedef struct { + pthread_mutex_t mutex; +} psync_openfile_t; + +static pthread_mutex_t psql_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_barrier_t barrier; + +static void psql_lock() { pthread_mutex_lock(&psql_mutex); } +static void psql_unlock() { pthread_mutex_unlock(&psql_mutex); } + +// NEW implementation: consistent lock ordering +static void pfs_get_both_locks_NEW(psync_openfile_t *of) { + psql_lock(); + pthread_mutex_lock(&of->mutex); +} + +static void *thread1_func(void *arg) { + psync_openfile_t *of = arg; + + for (int i = 0; i < 100; i++) { + pfs_get_both_locks_NEW(of); + pthread_mutex_unlock(&of->mutex); + psql_unlock(); + } + return NULL; +} + +static void *thread2_func(void *arg) { + psync_openfile_t *of = arg; + + for (int i = 0; i < 100; i++) { + pfs_get_both_locks_NEW(of); + pthread_mutex_unlock(&of->mutex); + psql_unlock(); + } + return NULL; +} + +int main() { + psync_openfile_t of; + pthread_mutex_init(&of.mutex, NULL); + + printf("=== Testing NEW lock ordering (deadlock-free) ===\n"); + + pthread_t t1, t2, t3, t4; + pthread_create(&t1, NULL, thread1_func, &of); + pthread_create(&t2, NULL, thread2_func, &of); + pthread_create(&t3, NULL, thread1_func, &of); + pthread_create(&t4, NULL, thread2_func, &of); + + // Wait with timeout + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += 5; + + void *ret; + int r1 = pthread_timedjoin_np(t1, &ret, &ts); + int r2 = pthread_timedjoin_np(t2, &ret, &ts); + int r3 = pthread_timedjoin_np(t3, &ret, &ts); + int r4 = pthread_timedjoin_np(t4, &ret, &ts); + + if (r1 != 0 || r2 != 0 || r3 != 0 || r4 != 0) { + printf("\nFAIL: threads hung (unexpected with new code)\n"); + return 1; + } + + pthread_mutex_destroy(&of.mutex); + printf("\nPASS: no deadlock with consistent lock ordering\n"); + return 0; +} diff --git a/tests/fault-inject/test_old b/tests/fault-inject/test_old new file mode 100755 index 0000000000000000000000000000000000000000..b95e3eaa1e1475856f254751b75376102717576c GIT binary patch literal 21192 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 literal 0 HcmV?d00001 diff --git a/tests/fault-inject/test_old_aggressive b/tests/fault-inject/test_old_aggressive new file mode 100755 index 0000000000000000000000000000000000000000..5b676f57be0125091b99bd8b1f13769d247cee60 GIT binary patch literal 21232 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 +#include +#include +#include +#include + +typedef struct { + pthread_mutex_t mutex; +} psync_openfile_t; + +static pthread_mutex_t psql_mutex = PTHREAD_MUTEX_INITIALIZER; + +static void psql_lock() { pthread_mutex_lock(&psql_mutex); } +static void psql_unlock() { pthread_mutex_unlock(&psql_mutex); } +static int psql_trylock() { return pthread_mutex_trylock(&psql_mutex); } + +static void pfs_get_both_locks_OLD(psync_openfile_t *of) { +retry: + psql_lock(); + if (pthread_mutex_trylock(&of->mutex)) { + psql_unlock(); + pthread_mutex_lock(&of->mutex); + if (psql_trylock()) { + pthread_mutex_unlock(&of->mutex); + usleep(1000); + goto retry; + } + } +} + +static volatile int timeout_flag = 0; +static volatile int iteration_count = 0; + +static void *timeout_thread(void *arg) { + sleep(10); + timeout_flag = 1; + printf("TIMEOUT: deadlock detected after 10 seconds (iterations: %d)\n", iteration_count); + exit(1); + return NULL; +} + +static void *thread_func(void *arg) { + psync_openfile_t *of = arg; + for (int i = 0; i < 10000; i++) { + if (timeout_flag) break; + pfs_get_both_locks_OLD(of); + __sync_fetch_and_add(&iteration_count, 1); + pthread_mutex_unlock(&of->mutex); + psql_unlock(); + // No sleep - maximize contention + } + return NULL; +} + +int main() { + psync_openfile_t of; + pthread_mutex_init(&of.mutex, NULL); + + pthread_t timeout_t; + pthread_create(&timeout_t, NULL, timeout_thread, NULL); + pthread_detach(timeout_t); + + pthread_t threads[8]; + for (int i = 0; i < 8; i++) { + pthread_create(&threads[i], NULL, thread_func, &of); + } + + for (int i = 0; i < 8; i++) { + pthread_join(threads[i], NULL); + } + + pthread_mutex_destroy(&of.mutex); + printf("UNEXPECTED: old code completed without deadlock (iterations: %d)\n", iteration_count); + return 0; +} diff --git a/tests/smoke-test-pfs-locks.sh b/tests/smoke-tests/smoke-test-pfs-locks.sh similarity index 100% rename from tests/smoke-test-pfs-locks.sh rename to tests/smoke-tests/smoke-test-pfs-locks.sh