Skip to content

Commit 636f565

Browse files
authored
Account for control character as part of zmq_read_part (sonic-net#906)
1 parent aba0f66 commit 636f565

2 files changed

Lines changed: 55 additions & 6 deletions

File tree

common/events_common.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -310,16 +310,23 @@ struct serialization
310310
more = 0;
311311
zmq_msg_init(&msg);
312312
int rc = zmq_msg_recv(&msg, sock, flag);
313-
if (rc != -1) {
313+
if (rc == 1) {
314+
char control_character = *(char*)zmq_msg_data(&msg);
315+
if (control_character == 0x01 || control_character == 0x00) {
316+
SWSS_LOG_INFO("Received subscription/unsubscription message when XSUB connect to XPUB: %c", control_character);
317+
} else {
318+
SWSS_LOG_DEBUG("Received non subscription based control character: %c", control_character);
319+
}
320+
rc = 0;
321+
} else if (rc != -1) {
314322
size_t more_size = sizeof (more);
315323

316324
zmq_getsockopt (sock, ZMQ_RCVMORE, &more, &more_size);
317325

318326
rc = zmsg_to_map(msg, data);
319327
RET_ON_ERR(rc == 0, "Failed to deserialize part rc=%d", rc);
320328
/* read more flag if message read fails to de-serialize */
321-
}
322-
else {
329+
} else {
323330
/* override with zmq err */
324331
rc = zmq_errno();
325332
if (rc != 11) {
@@ -332,7 +339,7 @@ struct serialization
332339
return rc;
333340
}
334341

335-
342+
336343
template<typename DT>
337344
int
338345
zmq_send_part(void *sock, int flag, const DT &data)

tests/events_common_ut.cpp

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,51 @@ TEST(events_common, send_recv)
9797
zmq_ctx_term(zmq_ctx);
9898
}
9999

100+
TEST(events_common, send_recv_control_character)
101+
{
102+
#if 0
103+
{
104+
/* Direct log messages to stdout */
105+
string dummy, op("STDOUT");
106+
swss::Logger::swssOutputNotify(dummy, op);
107+
swss::Logger::setMinPrio(swss::Logger::SWSS_DEBUG);
108+
}
109+
#endif
100110

111+
char *path = "tcp://127.0.0.1:5570";
112+
void *zmq_ctx = zmq_ctx_new();
113+
void *sock_p0 = zmq_socket (zmq_ctx, ZMQ_PAIR);
114+
EXPECT_EQ(0, zmq_connect (sock_p0, path));
101115

116+
void *sock_p1 = zmq_socket (zmq_ctx, ZMQ_PAIR);
117+
EXPECT_EQ(0, zmq_bind (sock_p1, path));
102118

119+
string source;
120+
map<string, string> m;
121+
122+
// Subscription based control character test
123+
zmq_msg_t sub_msg;
124+
zmq_msg_init_size(&sub_msg, 1);
125+
*(char*)zmq_msg_data(&sub_msg) = 0x01;
126+
EXPECT_EQ(1, zmq_msg_send(&sub_msg, sock_p0, 0));
127+
zmq_msg_close(&sub_msg);
128+
// First part will be read only and will return as 0, but will not be deserialized event
129+
EXPECT_EQ(0, zmq_message_read(sock_p1, 0, source, m));
130+
EXPECT_EQ("", source);
131+
EXPECT_EQ(0, m.size());
132+
133+
// Non-subscription based control character test
134+
zmq_msg_t ctrl_msg;
135+
zmq_msg_init_size(&ctrl_msg, 1);
136+
*(char*)zmq_msg_data(&ctrl_msg) = 0x07;
137+
EXPECT_EQ(1, zmq_msg_send(&ctrl_msg, sock_p0, 0));
138+
zmq_msg_close(&ctrl_msg);
139+
// First part will be read only and will return as 0, but will not be deserialized event
140+
EXPECT_EQ(0, zmq_message_read(sock_p1, 0, source, m));
141+
EXPECT_EQ("", source);
142+
EXPECT_EQ(0, m.size());
103143

104-
105-
144+
zmq_close(sock_p0);
145+
zmq_close(sock_p1);
146+
zmq_ctx_term(zmq_ctx);
147+
}

0 commit comments

Comments
 (0)