Skip to content

Commit 9aa40cb

Browse files
committed
WIP moving metrics to client options.
1 parent dc80e0d commit 9aa40cb

12 files changed

Lines changed: 126 additions & 64 deletions

include/aws/mqtt/private/v5/mqtt5_options_storage.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ struct aws_mqtt5_operation_pingreq {
139139

140140
struct aws_mqtt5_client_options_storage {
141141
struct aws_allocator *allocator;
142+
struct aws_mqtt5_client_options options;
142143

143144
struct aws_string *host_name;
144145
uint32_t port;
@@ -182,6 +183,8 @@ struct aws_mqtt5_client_options_storage {
182183
void *client_termination_handler_user_data;
183184

184185
struct aws_host_resolution_config host_resolution_override;
186+
187+
const struct aws_mqtt_iot_sdk_metrics *metrics;
185188
};
186189

187190
AWS_EXTERN_C_BEGIN
@@ -217,7 +220,8 @@ AWS_MQTT_API uint32_t aws_mqtt5_operation_get_ack_timeout_override(const struct
217220

218221
AWS_MQTT_API struct aws_mqtt5_operation_connect *aws_mqtt5_operation_connect_new(
219222
struct aws_allocator *allocator,
220-
const struct aws_mqtt5_packet_connect_view *connect_options);
223+
const struct aws_mqtt5_packet_connect_view *connect_options,
224+
const struct aws_mqtt5_client_options *client_config);
221225

222226
AWS_MQTT_API int aws_mqtt5_packet_connect_view_validate(const struct aws_mqtt5_packet_connect_view *connect_view);
223227

include/aws/mqtt/v5/mqtt5_client.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,11 @@ struct aws_mqtt5_client_options {
657657
* configuration but changes the refresh frequency to a value that prevents DNS pinging.
658658
*/
659659
struct aws_host_resolution_config *host_resolution_override;
660+
661+
/**
662+
* IoT SDK metrics configuration
663+
*/
664+
const struct aws_mqtt_iot_sdk_metrics *metrics;
660665
};
661666

662667
AWS_EXTERN_C_BEGIN

include/aws/mqtt/v5/mqtt5_packet_storage.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ AWS_MQTT_API size_t aws_mqtt5_user_property_set_size(const struct aws_mqtt5_user
209209
AWS_MQTT_API int aws_mqtt5_packet_connect_storage_init(
210210
struct aws_mqtt5_packet_connect_storage *connect_storage,
211211
struct aws_allocator *allocator,
212-
const struct aws_mqtt5_packet_connect_view *connect_options);
212+
const struct aws_mqtt5_packet_connect_view *connect_options,
213+
const struct aws_mqtt5_client_options *client_options);
213214

214215
AWS_MQTT_API int aws_mqtt5_packet_connect_storage_init_from_external_storage(
215216
struct aws_mqtt5_packet_connect_storage *connect_storage,

include/aws/mqtt/v5/mqtt5_types.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -396,9 +396,6 @@ struct aws_mqtt5_packet_connect_view {
396396
/* Do not bind these. We don't support AUTH packets yet. For decode/encade testing purposes only. */
397397
const struct aws_byte_cursor *authentication_method;
398398
const struct aws_byte_cursor *authentication_data;
399-
400-
/* IoT SDK metrics configuration */
401-
const struct aws_mqtt_iot_sdk_metrics *metrics;
402399
};
403400

404401
/**

source/v5/mqtt5_client.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1174,7 +1174,8 @@ static void s_change_current_state_to_mqtt_connect(struct aws_mqtt5_client *clie
11741174
aws_mqtt5_negotiated_settings_reset(&client->negotiated_settings, &connect_view);
11751175
connect_view.client_id = aws_byte_cursor_from_buf(&client->negotiated_settings.client_id_storage);
11761176

1177-
struct aws_mqtt5_operation_connect *connect_op = aws_mqtt5_operation_connect_new(client->allocator, &connect_view);
1177+
struct aws_mqtt5_operation_connect *connect_op =
1178+
aws_mqtt5_operation_connect_new(client->allocator, &connect_view, &client->config->options);
11781179
if (connect_op == NULL) {
11791180
int error_code = aws_last_error();
11801181
AWS_LOGF_ERROR(

source/v5/mqtt5_options_storage.c

Lines changed: 58 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -378,16 +378,6 @@ int aws_mqtt5_packet_connect_view_validate(const struct aws_mqtt5_packet_connect
378378
}
379379
}
380380

381-
if (connect_options->metrics != NULL) {
382-
if (aws_mqtt_validate_iot_sdk_metrics_utf8(connect_options->metrics)) {
383-
AWS_LOGF_ERROR(
384-
AWS_LS_MQTT5_GENERAL,
385-
"id=%p: aws_mqtt5_packet_connect_view - metrics not valid UTF-8",
386-
(void *)connect_options);
387-
return aws_raise_error(AWS_ERROR_MQTT5_CONNECT_OPTIONS_VALIDATION);
388-
}
389-
}
390-
391381
if (connect_options->receive_maximum != NULL) {
392382
if (*connect_options->receive_maximum == 0) {
393383
AWS_LOGF_ERROR(
@@ -645,7 +635,9 @@ void aws_mqtt5_packet_connect_storage_clean_up(struct aws_mqtt5_packet_connect_s
645635
aws_byte_buf_clean_up_secure(&storage->storage);
646636
}
647637

648-
static size_t s_aws_mqtt5_packet_connect_compute_storage_size(const struct aws_mqtt5_packet_connect_view *view) {
638+
static size_t s_aws_mqtt5_packet_connect_compute_storage_size(
639+
const struct aws_mqtt5_packet_connect_view *view,
640+
const struct aws_mqtt5_client_options *options) {
649641
if (view == NULL) {
650642
return 0;
651643
}
@@ -654,10 +646,10 @@ static size_t s_aws_mqtt5_packet_connect_compute_storage_size(const struct aws_m
654646

655647
storage_size += view->client_id.len;
656648
if (view->username != NULL) {
657-
if (view->metrics) {
649+
if (options && options->metrics) {
658650
size_t username_size = 0;
659651
aws_mqtt_append_sdk_metrics_to_username(
660-
aws_default_allocator(), view->username, *view->metrics, NULL, &username_size);
652+
aws_default_allocator(), view->username, *options->metrics, NULL, &username_size);
661653
storage_size += username_size;
662654
} else {
663655
storage_size += view->username->len;
@@ -670,8 +662,6 @@ static size_t s_aws_mqtt5_packet_connect_compute_storage_size(const struct aws_m
670662
storage_size +=
671663
s_aws_mqtt5_user_property_set_compute_storage_size(view->user_properties, view->user_property_count);
672664

673-
storage_size += aws_mqtt_iot_sdk_metrics_compute_storage_size(view->metrics);
674-
675665
if (view->authentication_method != NULL) {
676666
storage_size += view->authentication_method->len;
677667
}
@@ -686,12 +676,13 @@ static size_t s_aws_mqtt5_packet_connect_compute_storage_size(const struct aws_m
686676
int aws_mqtt5_packet_connect_storage_init(
687677
struct aws_mqtt5_packet_connect_storage *storage,
688678
struct aws_allocator *allocator,
689-
const struct aws_mqtt5_packet_connect_view *view) {
679+
const struct aws_mqtt5_packet_connect_view *view,
680+
const struct aws_mqtt5_client_options *client_config) {
690681
AWS_ZERO_STRUCT(*storage);
691682

692683
struct aws_mqtt5_packet_connect_view *storage_view = &storage->storage_view;
693684

694-
size_t storage_capacity = s_aws_mqtt5_packet_connect_compute_storage_size(view);
685+
size_t storage_capacity = s_aws_mqtt5_packet_connect_compute_storage_size(view, client_config);
695686
if (aws_byte_buf_init(&storage->storage, allocator, storage_capacity)) {
696687
return AWS_OP_ERR;
697688
}
@@ -710,10 +701,10 @@ int aws_mqtt5_packet_connect_storage_init(
710701
AWS_ZERO_STRUCT(metrics_username_buf);
711702

712703
/* Apply metrics to username if configured */
713-
if (view->metrics) {
704+
if (client_config->metrics != NULL) {
714705
struct aws_byte_cursor username_cur = storage->username;
715706
if (aws_mqtt_append_sdk_metrics_to_username(
716-
allocator, &username_cur, *view->metrics, &metrics_username_buf, NULL)) {
707+
allocator, &username_cur, *client_config->metrics, &metrics_username_buf, NULL)) {
717708
return AWS_OP_ERR;
718709
}
719710
storage->username = aws_byte_cursor_from_buf(&metrics_username_buf);
@@ -846,7 +837,8 @@ static void s_destroy_operation_connect(void *object) {
846837

847838
struct aws_mqtt5_operation_connect *aws_mqtt5_operation_connect_new(
848839
struct aws_allocator *allocator,
849-
const struct aws_mqtt5_packet_connect_view *connect_options) {
840+
const struct aws_mqtt5_packet_connect_view *connect_options,
841+
const struct aws_mqtt5_client_options *client_config) {
850842
AWS_PRECONDITION(allocator != NULL);
851843
AWS_PRECONDITION(connect_options != NULL);
852844

@@ -867,7 +859,8 @@ struct aws_mqtt5_operation_connect *aws_mqtt5_operation_connect_new(
867859
aws_priority_queue_node_init(&connect_op->base.priority_queue_node);
868860
connect_op->base.impl = connect_op;
869861

870-
if (aws_mqtt5_packet_connect_storage_init(&connect_op->options_storage, allocator, connect_options)) {
862+
if (aws_mqtt5_packet_connect_storage_init(
863+
&connect_op->options_storage, allocator, connect_options, client_config)) {
871864
goto error;
872865
}
873866

@@ -3420,6 +3413,13 @@ int aws_mqtt5_client_options_validate(const struct aws_mqtt5_client_options *opt
34203413
}
34213414
}
34223415

3416+
if (options->metrics != NULL) {
3417+
if (aws_mqtt_validate_iot_sdk_metrics_utf8(options->metrics)) {
3418+
AWS_LOGF_ERROR(AWS_LS_MQTT5_GENERAL, "invalid metrics in mqtt5 client configuration");
3419+
return aws_raise_error(AWS_ERROR_MQTT5_CONNECT_OPTIONS_VALIDATION);
3420+
}
3421+
}
3422+
34233423
return AWS_OP_SUCCESS;
34243424
}
34253425

@@ -3835,21 +3835,28 @@ struct aws_mqtt5_client_options_storage *aws_mqtt5_client_options_storage_new(
38353835
return NULL;
38363836
}
38373837

3838+
struct aws_mqtt5_client_options *options_view = &options_storage->options;
3839+
38383840
options_storage->allocator = allocator;
38393841
options_storage->host_name = aws_string_new_from_cursor(allocator, &options->host_name);
3842+
options_view->host_name = aws_byte_cursor_from_string(options_storage->host_name);
38403843
if (options_storage->host_name == NULL) {
38413844
goto error;
38423845
}
38433846

38443847
options_storage->port = options->port;
3848+
options_view->port = options_storage->port;
3849+
38453850
options_storage->bootstrap = aws_client_bootstrap_acquire(options->bootstrap);
3851+
options_view->bootstrap = options_storage->bootstrap;
38463852

38473853
if (options->socket_options != NULL) {
38483854
options_storage->socket_options = *options->socket_options;
38493855
} else {
38503856
options_storage->socket_options.type = AWS_SOCKET_STREAM;
38513857
options_storage->socket_options.connect_timeout_ms = AWS_MQTT5_DEFAULT_SOCKET_CONNECT_TIMEOUT_MS;
38523858
}
3859+
options_view->socket_options = &options_storage->socket_options;
38533860

38543861
if (options->tls_options != NULL) {
38553862
if (aws_tls_connection_options_copy(&options_storage->tls_options, options->tls_options)) {
@@ -3866,6 +3873,7 @@ struct aws_mqtt5_client_options_storage *aws_mqtt5_client_options_storage_new(
38663873
}
38673874
}
38683875
}
3876+
options_view->tls_options = options_storage->tls_options_ptr;
38693877

38703878
if (options->http_proxy_options != NULL) {
38713879
/* Ignore a specified proxy connection type and use TUNNEL unconditionally as only this proxy type works. */
@@ -3878,32 +3886,50 @@ struct aws_mqtt5_client_options_storage *aws_mqtt5_client_options_storage_new(
38783886
aws_http_proxy_options_init_from_config(
38793887
&options_storage->http_proxy_options, options_storage->http_proxy_config);
38803888
}
3889+
options_view->http_proxy_options = options->http_proxy_options;
38813890

38823891
options_storage->websocket_handshake_transform = options->websocket_handshake_transform;
3892+
options_view->websocket_handshake_transform = options_storage->websocket_handshake_transform;
38833893
options_storage->websocket_handshake_transform_user_data = options->websocket_handshake_transform_user_data;
3894+
options_view->websocket_handshake_transform_user_data = options_storage->websocket_handshake_transform_user_data;
38843895

38853896
options_storage->publish_received_handler = options->publish_received_handler;
3897+
options_view->publish_received_handler = options_storage->publish_received_handler;
38863898
options_storage->publish_received_handler_user_data = options->publish_received_handler_user_data;
3899+
options_view->publish_received_handler_user_data = options_storage->publish_received_handler_user_data;
38873900

38883901
options_storage->session_behavior = options->session_behavior;
3902+
options_view->session_behavior = options_storage->session_behavior;
38893903
options_storage->extended_validation_and_flow_control_options =
38903904
options->extended_validation_and_flow_control_options;
3905+
options_view->extended_validation_and_flow_control_options =
3906+
options_storage->extended_validation_and_flow_control_options;
38913907
options_storage->offline_queue_behavior = options->offline_queue_behavior;
3908+
options_view->offline_queue_behavior = options_storage->offline_queue_behavior;
38923909

38933910
options_storage->retry_jitter_mode = options->retry_jitter_mode;
3911+
options_view->retry_jitter_mode = options_storage->retry_jitter_mode;
38943912
options_storage->min_reconnect_delay_ms = options->min_reconnect_delay_ms;
3913+
options_view->min_reconnect_delay_ms = options_storage->min_reconnect_delay_ms;
38953914
options_storage->max_reconnect_delay_ms = options->max_reconnect_delay_ms;
3915+
options_view->max_reconnect_delay_ms = options_storage->max_reconnect_delay_ms;
38963916
options_storage->min_connected_time_to_reset_reconnect_delay_ms =
38973917
options->min_connected_time_to_reset_reconnect_delay_ms;
3918+
options_view->min_connected_time_to_reset_reconnect_delay_ms =
3919+
options_storage->min_connected_time_to_reset_reconnect_delay_ms;
38983920

38993921
options_storage->ping_timeout_ms = options->ping_timeout_ms;
3922+
options_view->ping_timeout_ms = options_storage->ping_timeout_ms;
39003923
options_storage->connack_timeout_ms = options->connack_timeout_ms;
3924+
options_view->connack_timeout_ms = options_storage->connack_timeout_ms;
39013925

39023926
options_storage->ack_timeout_seconds = options->ack_timeout_seconds;
3927+
options_view->ack_timeout_seconds = options_storage->ack_timeout_seconds;
39033928

39043929
if (options->topic_aliasing_options != NULL) {
39053930
options_storage->topic_aliasing_options = *options->topic_aliasing_options;
39063931
}
3932+
options_view->topic_aliasing_options = &options_storage->topic_aliasing_options;
39073933

39083934
struct aws_byte_buf auto_assign_id_buf;
39093935
AWS_ZERO_STRUCT(auto_assign_id_buf);
@@ -3965,18 +3991,23 @@ struct aws_mqtt5_client_options_storage *aws_mqtt5_client_options_storage_new(
39653991

39663992
options_storage->connect = aws_mem_calloc(allocator, 1, sizeof(struct aws_mqtt5_packet_connect_storage));
39673993
int connect_storage_result =
3968-
aws_mqtt5_packet_connect_storage_init(options_storage->connect, allocator, &connect_options);
3994+
aws_mqtt5_packet_connect_storage_init(options_storage->connect, allocator, &connect_options, options);
39693995

39703996
aws_byte_buf_clean_up(&auto_assign_id_buf);
39713997
if (connect_storage_result != AWS_OP_SUCCESS) {
39723998
goto error;
39733999
}
4000+
options_view->connect_options = &options_storage->connect->storage_view;
39744001

39754002
options_storage->lifecycle_event_handler = options->lifecycle_event_handler;
4003+
options_view->lifecycle_event_handler = options_storage->lifecycle_event_handler;
39764004
options_storage->lifecycle_event_handler_user_data = options->lifecycle_event_handler_user_data;
4005+
options_view->lifecycle_event_handler_user_data = options_storage->lifecycle_event_handler_user_data;
39774006

39784007
options_storage->client_termination_handler = options->client_termination_handler;
4008+
options_view->client_termination_handler = options_storage->client_termination_handler;
39794009
options_storage->client_termination_handler_user_data = options->client_termination_handler_user_data;
4010+
options_view->client_termination_handler_user_data = options_storage->client_termination_handler_user_data;
39804011

39814012
s_apply_zero_valued_defaults_to_client_options_storage(options_storage);
39824013

@@ -3988,6 +4019,11 @@ struct aws_mqtt5_client_options_storage *aws_mqtt5_client_options_storage_new(
39884019
options_storage->host_resolution_override.resolve_frequency_ns = aws_timestamp_convert(
39894020
options_storage->max_reconnect_delay_ms, AWS_TIMESTAMP_MILLIS, AWS_TIMESTAMP_NANOS, NULL);
39904021
}
4022+
options_view->host_resolution_override = &options_storage->host_resolution_override;
4023+
4024+
// TODO: Placehold for metrics storage implemnetation.
4025+
// options_storage->metrics = options->metrics;
4026+
// options_view->metrics = options_storage->metrics;
39914027

39924028
return options_storage;
39934029

source/v5/mqtt5_to_mqtt3_adapter.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1639,7 +1639,8 @@ static void s_set_login_task_fn(struct aws_task *task, void *arg, enum aws_task_
16391639

16401640
struct aws_mqtt5_packet_connect_storage *new_connect =
16411641
aws_mem_calloc(adapter->allocator, 1, sizeof(struct aws_mqtt5_packet_connect_storage));
1642-
aws_mqtt5_packet_connect_storage_init(new_connect, adapter->allocator, &new_connect_view);
1642+
aws_mqtt5_packet_connect_storage_init(
1643+
new_connect, adapter->allocator, &new_connect_view, &adapter->client->config->options);
16431644

16441645
adapter->client->config->connect = new_connect;
16451646
aws_mqtt5_packet_connect_storage_clean_up(old_connect);

tests/v5/mqtt5_client_tests.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ static int s_aws_mqtt5_client_test_init_default_connect_storage(
154154
.clean_start = true,
155155
};
156156

157-
return aws_mqtt5_packet_connect_storage_init(storage, allocator, &connect_view);
157+
return aws_mqtt5_packet_connect_storage_init(storage, allocator, &connect_view, NULL);
158158
}
159159

160160
static int s_aws_mqtt5_client_test_init_default_disconnect_storage(
@@ -1052,7 +1052,7 @@ static int s_aws_mqtt5_client_test_init_ping_test_connect_storage(
10521052
.clean_start = true,
10531053
};
10541054

1055-
return aws_mqtt5_packet_connect_storage_init(storage, allocator, &connect_view);
1055+
return aws_mqtt5_packet_connect_storage_init(storage, allocator, &connect_view, NULL);
10561056
}
10571057

10581058
/*
@@ -2970,7 +2970,7 @@ static int s_aws_mqtt5_client_test_init_resume_session_connect_storage(
29702970
.clean_start = false,
29712971
};
29722972

2973-
return aws_mqtt5_packet_connect_storage_init(storage, allocator, &connect_view);
2973+
return aws_mqtt5_packet_connect_storage_init(storage, allocator, &connect_view, NULL);
29742974
}
29752975

29762976
#define SESSION_RESUMPTION_CONNECT_COUNT 5
@@ -6667,6 +6667,7 @@ static int s_mqtt5_client_metrics_in_username_fn(
66676667

66686668
struct mqtt5_client_test_options test_options;
66696669
aws_mqtt5_client_test_init_default_options(&test_options);
6670+
test_options.client_options.metrics = metrics;
66706671

66716672
/* Set up username and metrics */
66726673
struct aws_byte_cursor original_username = aws_byte_cursor_from_c_str("test_user");
@@ -6675,7 +6676,6 @@ static int s_mqtt5_client_metrics_in_username_fn(
66756676
.keep_alive_interval_seconds = 30,
66766677
.client_id = aws_byte_cursor_from_string(g_default_client_id),
66776678
.clean_start = true,
6678-
.metrics = metrics,
66796679
.username = &original_username};
66806680

66816681
test_options.connect_options = connect_view;
@@ -6739,7 +6739,8 @@ static int s_mqtt5_client_metrics_in_username_fn(
67396739

67406740
struct aws_mqtt5_packet_connect_storage expected_connect_storage;
67416741

6742-
aws_mqtt5_packet_connect_storage_init(&expected_connect_storage, allocator, &connect_view);
6742+
aws_mqtt5_packet_connect_storage_init(
6743+
&expected_connect_storage, allocator, &connect_view, &test_options.client_options);
67436744

67446745
struct aws_mqtt5_packet_disconnect_storage expected_disconnect_storage;
67456746
ASSERT_SUCCESS(s_aws_mqtt5_client_test_init_default_disconnect_storage(&expected_disconnect_storage, allocator));

0 commit comments

Comments
 (0)