goczmq icon indicating copy to clipboard operation
goczmq copied to clipboard

poller.Wait unexpected behaviour

Open braatvedt opened this issue 4 years ago • 0 comments

I've created a small test to illustrate this, but in summary I have a poller.Wait(5000) on a dealer socket, yes 5 seconds. And a whole lot of responses queued up waiting to be read off. Now I'd expect the messages to all be read off and then when there's been no new messages for 5 seconds the socket returned from the poller.Wait(5000) would be nil. I seem to get a few nil sockets whilst reading the messages, and within 5 seconds of each other.

Code here:

package main

import (
	"fmt"
	"github.com/zeromq/goczmq"
	"testing"
	"time"
)

func TestWaitNotWaiting(t *testing.T) {
	// create an echo router
	router, err := goczmq.NewRouter("tcp://127.0.0.1:9999")
	if err != nil {
		t.Fatal(err)
	}
	defer router.Destroy()

	// echo all messages received by router back to dealer
	go func() {
		poller, err := goczmq.NewPoller(router)
		if err != nil {
			t.Fatal(err)
		}

		for {
			sock := poller.Wait(100)
			if sock != nil {
				req, err := sock.RecvMessage()
				if err != nil {
					t.Error("error getting message", err)
				}
				err = sock.SendMessage(req)
				if err != nil {
					t.Error("error sending message", err)
				}
			}
		}
	}()

	dealer, err := goczmq.NewDealer("tcp://127.0.0.1:9999")
	if err != nil {
		t.Fatal(err)
	}
	defer dealer.Destroy()

	for i := 0; i < 100000; i++ {
		err := dealer.SendMessage([][]byte{
			[]byte(string(i)),
		})
		if err != nil {
			t.Fatal("error sending message", err)
		}
	}

	poller, err := goczmq.NewPoller(dealer)
	if err != nil {
		t.Fatal("error setting up poller", err)
	}

	// now for the fun
	for {
		sock := poller.Wait(5000) // wait 5 seconds, this is long for illustration purposes.
		if sock != nil {
			_, err := sock.RecvMessage()
			if err != nil {
				t.Fatal(err)
			}
		} else {
			fmt.Println("Time", time.Now())
		}
	}
}

and sample output, first 3 calls very close together and then the wait time appears to be working when nothing is on the queue anymore:

=== RUN   TestWaitNotWaiting
Time 2020-04-29 12:58:07.837648709 +0200 SAST m=+0.254047379
Time 2020-04-29 12:58:07.977043834 +0200 SAST m=+0.393442503
Time 2020-04-29 12:58:08.001565177 +0200 SAST m=+0.417963859
Time 2020-04-29 12:58:13.006290839 +0200 SAST m=+5.422689588
Time 2020-04-29 12:58:18.011217611 +0200 SAST m=+10.427616376

braatvedt avatar Apr 29 '20 11:04 braatvedt