Commit 363e48d9 authored by Wojciech Malikowski's avatar Wojciech Malikowski Committed by Ben Walker
Browse files

test/unit/ftl: Fix rwb_parallel unit test



This test was causing rare random failures of unit tests

Change-Id: I3031ed9a7f01018f093d9856b719b7604c5e30f1
Signed-off-by: default avatarWojciech Malikowski <wojciech.malikowski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/441875


Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarJakub Radtke <jakub.radtke@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
parent d010fe26
Loading
Loading
Loading
Loading
+10 −12
Original line number Diff line number Diff line
@@ -184,7 +184,7 @@ test_rwb_worker(void *ctx)
{
#define ENTRIES_PER_WORKER (16 * RWB_ENTRY_COUNT)
	struct ftl_rwb_entry *entry;
	bool *done = ctx;
	unsigned int *num_done = ctx;
	size_t i;

	for (i = 0; i < ENTRIES_PER_WORKER; ++i) {
@@ -201,7 +201,7 @@ test_rwb_worker(void *ctx)
		}
	}

	__atomic_store_n(done, true, __ATOMIC_SEQ_CST);
	__atomic_fetch_add(num_done, 1, __ATOMIC_SEQ_CST);
	return NULL;
}

@@ -212,14 +212,14 @@ test_rwb_parallel(void)
	struct ftl_rwb_entry *entry;
#define NUM_PARALLEL_WORKERS 4
	pthread_t workers[NUM_PARALLEL_WORKERS];
	bool done[NUM_PARALLEL_WORKERS];
	unsigned int num_done = 0;
	size_t i, num_entries = 0;
	int rc, num_done;
	bool all_done = false;
	int rc;

	setup_rwb();
	for (i = 0; i < NUM_PARALLEL_WORKERS; ++i) {
		done[i] = false;
		rc = pthread_create(&workers[i], NULL, test_rwb_worker, (void *)&done[i]);
		rc = pthread_create(&workers[i], NULL, test_rwb_worker, (void *)&num_done);
		CU_ASSERT_TRUE(rc == 0);
	}

@@ -232,15 +232,13 @@ test_rwb_parallel(void)

			ftl_rwb_batch_release(batch);
		} else {
			num_done = 0;
			for (i = 0; i < NUM_PARALLEL_WORKERS; ++i) {
				if (__atomic_load_n(&done[i], __ATOMIC_SEQ_CST)) {
					num_done++;
			if (NUM_PARALLEL_WORKERS == __atomic_load_n(&num_done, __ATOMIC_SEQ_CST)) {
				if (!all_done) {
					/*  Pop all left entries from rwb */
					all_done = true;
					continue;
				}
			}

			if (num_done == NUM_PARALLEL_WORKERS) {
				for (i = 0; i < NUM_PARALLEL_WORKERS; ++i) {
					pthread_join(workers[i], NULL);
				}