diff options
author | Emmanuel Vasilakis <mrzammler@mm.st> | 2022-01-19 19:52:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-19 19:52:50 +0200 |
commit | 6600f33247368f0b124351abe5e9acf6e49c8cd2 (patch) | |
tree | a75d98febd6714132f5b1bbc2addbd8b400cae3c | |
parent | c5eb91bad10ea8079c6fa630de54b38762abebaf (diff) |
Handle re-claim while the agent is running in new architecture (#11924)
* re-connect when re-claiming
* send the previous claim_id when disconnecting
* use same block for aclk_kill_link
* free prev_claimed_id
-rw-r--r-- | aclk/aclk.c | 2 | ||||
-rw-r--r-- | aclk/aclk_rrdhost_state.h | 1 | ||||
-rw-r--r-- | aclk/aclk_tx_msgs.c | 9 | ||||
-rw-r--r-- | aclk/aclk_util.h | 1 | ||||
-rw-r--r-- | claim/claim.c | 2 | ||||
-rwxr-xr-x | claim/netdata-claim.sh.in | 4 | ||||
-rw-r--r-- | database/rrdhost.c | 1 |
7 files changed, 16 insertions, 4 deletions
diff --git a/aclk/aclk.c b/aclk/aclk.c index fea83a1f8f..936f431b6b 100644 --- a/aclk/aclk.c +++ b/aclk/aclk.c @@ -320,7 +320,7 @@ static int handle_connection(mqtt_wss_client client) return 1; } - if (disconnect_req) { + if (disconnect_req || aclk_kill_link) { disconnect_req = 0; aclk_graceful_disconnect(client); aclk_queue_unlock(); diff --git a/aclk/aclk_rrdhost_state.h b/aclk/aclk_rrdhost_state.h index 73925b3308..9138123dfe 100644 --- a/aclk/aclk_rrdhost_state.h +++ b/aclk/aclk_rrdhost_state.h @@ -30,6 +30,7 @@ typedef enum aclk_agent_state { typedef struct aclk_rrdhost_state { char *claimed_id; // Claimed ID if host has one otherwise NULL + char *prev_claimed_id; // Claimed ID if changed (reclaimed) during runtime #ifdef ACLK_LEGACY // per child popcorning diff --git a/aclk/aclk_tx_msgs.c b/aclk/aclk_tx_msgs.c index 5bfe28e5da..0f66ea4ea8 100644 --- a/aclk/aclk_tx_msgs.c +++ b/aclk/aclk_tx_msgs.c @@ -420,7 +420,10 @@ uint16_t aclk_send_agent_connection_update(mqtt_wss_client client, int reachable rrdhost_aclk_state_unlock(localhost); return 0; } - conn.claim_id = localhost->aclk_state.claimed_id; + if (localhost->aclk_state.prev_claimed_id) + conn.claim_id = localhost->aclk_state.prev_claimed_id; + else + conn.claim_id = localhost->aclk_state.claimed_id; char *msg = generate_update_agent_connection(&len, &conn); rrdhost_aclk_state_unlock(localhost); @@ -432,6 +435,10 @@ uint16_t aclk_send_agent_connection_update(mqtt_wss_client client, int reachable pid = aclk_send_bin_message_subtopic_pid(client, msg, len, ACLK_TOPICID_AGENT_CONN, "UpdateAgentConnection"); freez(msg); + if (localhost->aclk_state.prev_claimed_id) { + freez(localhost->aclk_state.prev_claimed_id); + localhost->aclk_state.prev_claimed_id = NULL; + } return pid; } diff --git a/aclk/aclk_util.h b/aclk/aclk_util.h index 07de5c58a3..4d8744e7f2 100644 --- a/aclk/aclk_util.h +++ b/aclk/aclk_util.h @@ -7,7 +7,6 @@ // Helper stuff which should not have any further inside ACLK dependency // and are supposed not to be needed outside of ACLK - extern int aclk_use_new_cloud_arch; extern usec_t aclk_session_newarch; diff --git a/claim/claim.c b/claim/claim.c index 2007b637a5..c919fa3bdc 100644 --- a/claim/claim.c +++ b/claim/claim.c @@ -136,6 +136,8 @@ void load_claiming_state(void) uuid_t uuid; rrdhost_aclk_state_lock(localhost); if (localhost->aclk_state.claimed_id) { + if (aclk_connected) + localhost->aclk_state.prev_claimed_id = strdupz(localhost->aclk_state.claimed_id); freez(localhost->aclk_state.claimed_id); localhost->aclk_state.claimed_id = NULL; } diff --git a/claim/netdata-claim.sh.in b/claim/netdata-claim.sh.in index f2120ae9cd..9f04de0daa 100755 --- a/claim/netdata-claim.sh.in +++ b/claim/netdata-claim.sh.in @@ -386,7 +386,9 @@ fi if [ "${HTTP_STATUS_CODE}" = "204" ] || [ "${ERROR_KEY}" = "ErrAlreadyClaimed" ] ; then rm -f "${CLAIMING_DIR}/tmpout.txt" - echo -n "${ID}" >"${CLAIMING_DIR}/claimed_id" || (echo >&2 "Claiming failed"; set -e; exit 2) + if [ "${HTTP_STATUS_CODE}" = "204" ] ; then + echo -n "${ID}" >"${CLAIMING_DIR}/claimed_id" || (echo >&2 "Claiming failed"; set -e; exit 2) + fi rm -f "${CLAIMING_DIR}/token" || (echo >&2 "Claiming failed"; set -e; exit 2) # Rewrite the cloud.conf on the disk diff --git a/database/rrdhost.c b/database/rrdhost.c index 09db807588..79e283a631 100644 --- a/database/rrdhost.c +++ b/database/rrdhost.c @@ -954,6 +954,7 @@ void rrdhost_free(RRDHOST *host) { pthread_mutex_destroy(&host->aclk_state_lock); freez(host->aclk_state.claimed_id); + freez(host->aclk_state.prev_claimed_id); freez((void *)host->tags); free_label_list(host->labels.head); freez((void *)host->os); |