summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Vasilakis <mrzammler@mm.st>2022-01-19 19:52:50 +0200
committerGitHub <noreply@github.com>2022-01-19 19:52:50 +0200
commit6600f33247368f0b124351abe5e9acf6e49c8cd2 (patch)
treea75d98febd6714132f5b1bbc2addbd8b400cae3c
parentc5eb91bad10ea8079c6fa630de54b38762abebaf (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.c2
-rw-r--r--aclk/aclk_rrdhost_state.h1
-rw-r--r--aclk/aclk_tx_msgs.c9
-rw-r--r--aclk/aclk_util.h1
-rw-r--r--claim/claim.c2
-rwxr-xr-xclaim/netdata-claim.sh.in4
-rw-r--r--database/rrdhost.c1
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);