summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfumingwei <[email protected]>2023-08-31 19:36:47 +0800
committerfumingwei <[email protected]>2023-08-31 19:37:00 +0800
commitc6e449c69900cdaed15c48a5f6d64a74e1a0f7c4 (patch)
treef48798971c71d6fc3f21521a736c2fce9cdfe19b
parent7c96bc412f9ebb3b48bd96d75598cd0d20ab60b3 (diff)
bugfix:给调用uthash的语句加自旋锁
-rw-r--r--src/fieldstat_dynamic.cpp26
-rw-r--r--src/fieldstat_internal.h2
-rw-r--r--src/line_protocol_output.cpp2
3 files changed, 28 insertions, 2 deletions
diff --git a/src/fieldstat_dynamic.cpp b/src/fieldstat_dynamic.cpp
index 04efa59..7b2cb52 100644
--- a/src/fieldstat_dynamic.cpp
+++ b/src/fieldstat_dynamic.cpp
@@ -25,6 +25,12 @@ struct fieldstat_dynamic_instance * fieldstat_dynamic_instance_new(const char *n
instance->n_thread = n_thread;
instance->n_thread_dynamic_metric = (struct dynamic_metric **)calloc(instance->n_thread, sizeof(struct dynamic_metric *));
+ instance->uthash_locks = (pthread_spinlock_t*)calloc(n_thread, sizeof(pthread_spinlock_t));
+ for(int i = 0; i < n_thread; i++)
+ {
+ pthread_spin_init(instance->uthash_locks + i, PTHREAD_PROCESS_SHARED);
+ }
+
return instance;
}
@@ -91,6 +97,15 @@ void fieldstat_dynamic_instance_free(struct fieldstat_dynamic_instance *instance
instance->table_metrics[i] = NULL;
}
+ if(instance->uthash_locks)
+ {
+ for(i = 0; i < instance->n_thread; i++)
+ {
+ pthread_spin_destroy(instance->uthash_locks + i);
+ }
+ free((void *)instance->uthash_locks);
+ instance->uthash_locks = NULL;
+ }
free(instance->n_thread_dynamic_metric);
instance->n_thread_dynamic_metric = NULL;
free(instance);
@@ -327,8 +342,9 @@ static struct metric * read_dynamic_metric(struct fieldstat_dynamic_instance *in
{
return NULL;
}
-
+ pthread_spin_lock(instance->uthash_locks + thread_id);
HASH_FIND(hh, *head, dynamic_metric_key, dynamic_metric_keylen, find);
+ pthread_spin_unlock(instance->uthash_locks + thread_id);
if(find == NULL)
{
return NULL;
@@ -404,7 +420,9 @@ static struct metric * create_dynamic_table_metric(struct fieldstat_dynamic_inst
value->metrics[i] = metric;
}
+ pthread_spin_lock(instance->uthash_locks + thread_id);
HASH_ADD_KEYPTR(hh, *head, value->metric_key, value->metric_keylen, value);
+ pthread_spin_unlock(instance->uthash_locks + thread_id);
return value->metrics[column_id];
}
@@ -452,7 +470,9 @@ static struct metric * create_dynamic_metric(struct fieldstat_dynamic_instance *
}
*(insert->metrics) = metric;
+ pthread_spin_lock(instance->uthash_locks + thread_id);
HASH_ADD_KEYPTR(hh, *head, insert->metric_key, insert->metric_keylen, insert);
+ pthread_spin_unlock(instance->uthash_locks + thread_id);
return metric;
}
@@ -563,7 +583,9 @@ static struct metric **read_dynamic_row_metrics(
head = &instance->n_thread_dynamic_metric[thread_id];
+ pthread_spin_lock(instance->uthash_locks + thread_id);
HASH_FIND(hh, *head, metric_key, metric_keylen, find);
+ pthread_spin_unlock(instance->uthash_locks + thread_id);
if(find == NULL)
{
return NULL;
@@ -628,7 +650,9 @@ static struct metric **create_dynamic_table_row_metrics(
value->metrics[i] = metric;
}
+ pthread_spin_lock(instance->uthash_locks + thread_id);
HASH_ADD_KEYPTR(hh, *head, value->metric_key, value->metric_keylen, value);
+ pthread_spin_unlock(instance->uthash_locks + thread_id);
return value->metrics;
}
diff --git a/src/fieldstat_internal.h b/src/fieldstat_internal.h
index 5e3c33b..47da22d 100644
--- a/src/fieldstat_internal.h
+++ b/src/fieldstat_internal.h
@@ -242,7 +242,7 @@ struct fieldstat_dynamic_instance
struct dynamic_metric **n_thread_dynamic_metric;
int n_thread;
int output_type; // 0b0000:not output, 0b1000:output file, 0b0100:output line_protocol, 0b0010: output statsd, 0b0001: output prometheus
-
+ pthread_spinlock_t *uthash_locks;
};
void prometheus_endpoint_instance_output(struct http_request_s* request);
diff --git a/src/line_protocol_output.cpp b/src/line_protocol_output.cpp
index 1366b05..b1f9389 100644
--- a/src/line_protocol_output.cpp
+++ b/src/line_protocol_output.cpp
@@ -470,6 +470,7 @@ int line_protocol_dynamic_metric_output(struct fieldstat_dynamic_instance *insta
for(int i = 0; i < instance->n_thread; i++)
{
+ pthread_spin_lock(instance->uthash_locks + i);
head = &instance->n_thread_dynamic_metric[i];
HASH_ITER(hh, *head, dyn_metric, tmp_dyn_metric)
{
@@ -487,6 +488,7 @@ int line_protocol_dynamic_metric_output(struct fieldstat_dynamic_instance *insta
}
send_line_buf(&instance->line_protocol_output, line_buf, used_len);
}
+ pthread_spin_unlock(instance->uthash_locks + i);
}
flush_send_buf(&instance->line_protocol_output);