func qnotify(client *clients.Client, args []string) (interface{}, error) { timeout, err := parseInt(args[0], "timeout") if err != nil { return err, nil } // ensure the NotifyCh is empty before waiting queueName := "" client.DrainNotifyCh() // check to see if we have any events in the registered queues. We check the // list in a randomized order since very active queues in the list may not // ever let us check after them in the list, abandoning the rest of the list queueNames := client.Queues for _, i := range rand.Perm(len(queueNames)) { unclaimedKey := db.UnclaimedKey(queueNames[i]) var unclaimedCount int unclaimedCount, err = db.Inst.Cmd("LLEN", unclaimedKey).Int() if err != nil { return nil, fmt.Errorf("QNOTIFY LLEN unclaimed): %s", err) } if unclaimedCount > 0 { queueName = queueNames[i] break } } if queueName == "" { select { case <-time.After(time.Duration(timeout) * time.Second): case queueName = <-client.NotifyCh: } } if queueName != "" { return queueName, nil } return nil, nil }