diff options
| author | fumingwei <[email protected]> | 2023-08-31 19:36:47 +0800 |
|---|---|---|
| committer | fumingwei <[email protected]> | 2023-08-31 19:37:00 +0800 |
| commit | c6e449c69900cdaed15c48a5f6d64a74e1a0f7c4 (patch) | |
| tree | f48798971c71d6fc3f21521a736c2fce9cdfe19b | |
| parent | 7c96bc412f9ebb3b48bd96d75598cd0d20ab60b3 (diff) | |
bugfix:给调用uthash的语句加自旋锁
| -rw-r--r-- | src/fieldstat_dynamic.cpp | 26 | ||||
| -rw-r--r-- | src/fieldstat_internal.h | 2 | ||||
| -rw-r--r-- | src/line_protocol_output.cpp | 2 |
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); |
