From 1b841fe3cf28bb393d01f8ca8da5187aff7bfa3d Mon Sep 17 00:00:00 2001 From: Ivan Kozlovic Date: Wed, 5 Oct 2022 15:58:41 -0600 Subject: [PATCH] [FIXED] JetStream: `jsConsumerConfig.Name` was not unmarshal'ed The new configuration `Name` in `jsConsumerConfig` could be set when calling `js_AddConsumer`, but when getting the `jsConsumerInfo` response (from that call or any `js_GetConsumerInfo`, the `Name` was present in `jsConsumerInfo`, but was not in the `Config` field (a `jsConsumerConfig`). Although I am not sure this is needed, making sure that we unmarshal properly. Signed-off-by: Ivan Kozlovic --- src/jsm.c | 2 ++ test/test.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/jsm.c b/src/jsm.c index 641a498da..f7aaae1ba 100644 --- a/src/jsm.c +++ b/src/jsm.c @@ -2660,6 +2660,7 @@ _destroyConsumerConfig(jsConsumerConfig *cc) if (cc == NULL) return; + NATS_FREE((char*) cc->Name); NATS_FREE((char*) cc->Durable); NATS_FREE((char*) cc->Description); NATS_FREE((char*) cc->DeliverSubject); @@ -2761,6 +2762,7 @@ _unmarshalConsumerConfig(nats_JSON *json, const char *fieldName, jsConsumerConfi if ((s == NATS_OK) && (cjson != NULL)) { s = nats_JSONGetStr(cjson, "durable_name", (char**) &(cc->Durable)); + IFOK(s, nats_JSONGetStr(cjson, "name", (char**) &(cc->Name))); IFOK(s, nats_JSONGetStr(cjson, "description", (char**) &(cc->Description))); IFOK(s, nats_JSONGetStr(cjson, "deliver_subject", (char**) &(cc->DeliverSubject))); IFOK(s, nats_JSONGetStr(cjson, "deliver_group", (char**) &(cc->DeliverGroup))); diff --git a/test/test.c b/test/test.c index 0e9663d05..9e0e682f1 100644 --- a/test/test.c +++ b/test/test.c @@ -21976,6 +21976,7 @@ test_JetStreamUnmarshalConsumerInfo(void) "{\"config\":{\"backoff\":[50000000,250000000]}}", "{\"config\":{\"num_replicas\":1}}", "{\"config\":{\"mem_storage\":true}}", + "{\"config\":{\"name\":\"my_name\"}}", }; const char *bad[] = { "{\"stream_name\":123}", @@ -23551,6 +23552,41 @@ test_JetStreamMgtConsumers(void) natsSubscription_Destroy(sub); sub = NULL; + test("Create check sub: "); + natsSubscription_Destroy(sub); + sub = NULL; + s = natsConnection_SubscribeSync(&sub, nc, "$JS.API.CONSUMER.CREATE.MY_STREAM.>"); + testCond(s == NATS_OK); + + test("Add consumer (name): "); + cfg.Durable = NULL; + cfg.Name = "my_name"; + s = js_AddConsumer(&ci, js, "MY_STREAM", &cfg, NULL, &jerr); + testCond((s = NATS_ERR) && (jerr == JSStreamNotFoundErr) && (ci == NULL)); + nats_clearLastError(); + + test("Verify config: "); + s = natsSubscription_NextMsg(&resp, sub, 1000); + testCond((s == NATS_OK) && (resp != NULL) + && (strncmp(natsMsg_GetData(resp), + "{\"stream_name\":\"MY_STREAM\","\ + "\"config\":{\"deliver_policy\":\"last\","\ + "\"name\":\"my_name\","\ + "\"description\":\"MyDescription\","\ + "\"deliver_subject\":\"foo\","\ + "\"opt_start_seq\":100,"\ + "\"opt_start_time\":\"2021-06-23T18:22:00.12345Z\",\"ack_policy\":\"explicit\","\ + "\"ack_wait\":200,\"max_deliver\":300,\"filter_subject\":\"bar\","\ + "\"replay_policy\":\"instant\",\"rate_limit_bps\":400,"\ + "\"sample_freq\":\"60%%\",\"max_waiting\":500,\"max_ack_pending\":600,"\ + "\"flow_control\":true,\"idle_heartbeat\":700,"\ + "\"num_replicas\":1,\"mem_storage\":true}}", + natsMsg_GetDataLength(resp)) == 0)); + natsMsg_Destroy(resp); + resp = NULL; + natsSubscription_Destroy(sub); + sub = NULL; + test("Create stream: "); jsStreamConfig_Init(&scfg); scfg.Name = "MY_STREAM"; @@ -23559,6 +23595,19 @@ test_JetStreamMgtConsumers(void) s = js_AddStream(NULL, js, &scfg, NULL, &jerr); testCond((s == NATS_OK) && (jerr == 0)); + test("Add consumer (name): "); + jsConsumerConfig_Init(&cfg); + cfg.Name = "my_name"; + cfg.DeliverSubject = "mn.foo"; + cfg.FilterSubject = "bar.>"; + s = js_AddConsumer(&ci, js, "MY_STREAM", &cfg, NULL, &jerr); + testCond((s == NATS_OK) && (jerr == 0) && (ci != NULL) + && (strcmp(ci->Stream, "MY_STREAM") == 0) + && (strcmp(ci->Name, "my_name") == 0) + && (strcmp(ci->Config->Name, "my_name") == 0)); + jsConsumerInfo_Destroy(ci); + ci = NULL; + test("Add consumer (durable): "); jsConsumerConfig_Init(&cfg); cfg.Durable = "dur";