zeromq / libzmq

ZeroMQ core engine in C++, implements ZMTP/3.1
https://www.zeromq.org
Mozilla Public License 2.0
9.71k stars 2.35k forks source link

Server with IPC & PAIR can not receive messags from restart client for coredump #4424

Closed yangelaboy closed 2 years ago

yangelaboy commented 2 years ago

Please use this template for reporting suspected bugs or requests for help.

Issue description

When using PAIR-PAIR patten with ipc,client happened coredump, restarted client can connect and send messages to server, but the server can not receive any message.

Environment

Minimal test code / Steps to reproduce the issue

  1. start server
    
    ctxt = new ZContext();
    server = ctxt.createSocket(ZMQ.PULL);
    serverMonitor = ctxt.createSocket(ZMQ.PAIR);
    System.out.printf("[%s][%d] monitor addr: %s\r\n", name, System.currentTimeMillis(), monitorAddr);
    boolean result = server.monitor(monitorAddr, ZMQ.EVENT_ALL);
    System.out.printf("[%s]monitor all events result: %s\r\n", name, result);
    serverMonitor.connect(monitorAddr);

// start thread to recv monitor event new Thread(() -> { while (true) { ZMQ.Event event = ZMQ.Event.recv(serverMonitor); System.out.printf("[%s][%d] monitor event: %s, addr: %s\r\n", name, System.currentTimeMillis(), ZMQMain1.EventName(event.getEvent()), event.getAddress()); } }).start();

System.out.printf("[%s][%d]server bind!\r\n", name, System.currentTimeMillis()); server.bind(addr); // start thread to recv msg new Thread(() -> { int i = 0; while (true) { try { String data = new String(server.recv()); System.out.printf("[%s][%d]recv data: %s for times: %d\r\n", name, System.currentTimeMillis(), data, i++); } catch (Exception e) { e.printStackTrace(); } } }).start();


2. client connect to server

client = ctxt.createSocket(ZMQ.PUSH); clientMonitor = ctxt.createSocket(ZMQ.PAIR); boolean result = client.monitor(monitorAddr, ZMQ.EVENT_ALL); System.out.printf("[%s]moclosenitor all events result: %s\r\n", name, result); // start thread to recv monitor event new Thread(() -> { while (true) { ZMQ.Event event = ZMQ.Event.recv(clientMonitor); System.out.printf("[%s][%d] monitor event: %s, addr: %s\r\n", name, System.currentTimeMillis(), MQMain1.EventName(event.getEvent()), event.getAddress()); } }).start(); System.out.printf("[%s][%d]monitor be ready!\r\n", name, System.currentTimeMillis()); clientMonitor.connect(monitorAddr); System.out.printf("[%s][%d]connect to server!\r\n", name, System.currentTimeMillis()); client.connect(addr); // start thread to send msg new Thread(() -> { while (counter-- > 0) { try { boolean result = client.send("hello world from " + name); System.out.printf("[%s][%d]send msg for times: %d, res: %s!\r\n", name, System.currentTimeMillis(), i++, result); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } }).start();



3. client coredump then restart, and send msg
To mock client(c++) coredump, we start two client thread.
4. server can not receive any msgs
server can receive msg from first client. server cannot receive msg from second cleint, event first client stopped(like coredump).

# What's the actual result? (include assertion message & call stack if applicable)
client happens coredump, restart client can connect and send messges to server, but server cannot recieve messages from restart client.

# What's the expected result?
server could receive messages from restart client.
bluca commented 2 years ago

You must create sockets in the same thread from where you use them