From: Alan T. DeKok Date: Sat, 24 Jan 2026 18:39:50 +0000 (-0500) Subject: more tweaks to state code X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0881ce5b6e7a1cf43c74f4d10fafa00819455d2c;p=thirdparty%2Ffreeradius-server.git more tweaks to state code we don't need to update ID on every packet. It's OK to do it once when we start a new session. clear "thawed" on store. remove unused code --- diff --git a/src/lib/server/state.c b/src/lib/server/state.c index 8bc710102d8..826017117e0 100644 --- a/src/lib/server/state.c +++ b/src/lib/server/state.c @@ -127,8 +127,6 @@ typedef struct { fr_dlist_head_t data; //!< Persistable request data, also parented by ctx. request_t *thawed; //!< The request that thawed this entry. - - fr_state_tree_t *state_tree; //!< Tree this entry belongs to. } fr_state_entry_t; /** A child of a fr_state_entry_t @@ -430,23 +428,15 @@ static fr_state_entry_t *state_entry_create(fr_state_tree_t *state, request_t *r MEM(entry = talloc_zero(NULL, fr_state_entry_t)); talloc_set_destructor(entry, _state_entry_free); - /* - * Reuse the old state entry cleaning up any memory associated - * with it. - */ + entry->id = state->id++; + } else { - _state_entry_free(old); - talloc_free_children(old); - memset(old, 0, sizeof(*old)); + fr_assert(!old->ctx); entry = old; } - entry->state_tree = state; - request_data_list_init(&entry->data); - entry->id = state->id++; - /* * Limit the lifetime of this entry based on how long the * server takes to process a request. Doing it this way @@ -567,6 +557,8 @@ static fr_state_entry_t *state_entry_create(fr_state_tree_t *state, request_t *r */ fr_dlist_insert_tail(&state->to_expire, entry); + entry->thawed = NULL; + return entry; } @@ -688,15 +680,14 @@ int fr_state_restore(fr_state_tree_t *state, request_t *request) PTHREAD_MUTEX_LOCK(&state->mutex); entry = state_entry_find_and_unlink(state, &vp->data); + PTHREAD_MUTEX_UNLOCK(&state->mutex); if (!entry) { - PTHREAD_MUTEX_UNLOCK(&state->mutex); RDEBUG2("No state entry matching request.%pP found", vp); return 2; } - PTHREAD_MUTEX_UNLOCK(&state->mutex); /* Probably impossible in the current code */ - if (unlikely(entry->thawed != NULL)) { + if (unlikely(entry->thawed && (entry->thawed != request))) { RERROR("State entry has already been thawed by a request %"PRIu64, entry->thawed->number); return -2; } @@ -775,13 +766,14 @@ int fr_state_store(fr_state_tree_t *state, request_t *request) } MEM(state_ctx = request_state_replace(request, NULL)); - PTHREAD_MUTEX_LOCK(&state->mutex); /* * Reuses old if possible, and leaves the mutex unlocked on failure. */ + PTHREAD_MUTEX_LOCK(&state->mutex); entry = state_entry_create(state, request, &request->reply_pairs, old); if (!entry) { + PTHREAD_MUTEX_UNLOCK(&state->mutex); talloc_free(request_state_replace(request, state_ctx)); request_data_restore(request, &data); /* Put it back again */ return -1;