Pārlūkot izejas kodu

Fix broker asyncness

You can actually have a second thread send while the first is still waiting for
a response now. The previous changes had the sender hold the lock the entire
time, which was silly. That's what the channel is for.
Evan Huus 12 gadi atpakaļ
vecāks
revīzija
23ba8a91f3
1 mainītis faili ar 20 papildinājumiem un 6 dzēšanām
  1. 20 6
      broker.go

+ 20 - 6
broker.go

@@ -99,31 +99,45 @@ func (b *Broker) Produce(clientID *string, request *ProduceRequest) (*ProduceRes
 	return response, nil
 	return response, nil
 }
 }
 
 
-func (b *Broker) sendAndReceive(clientID *string, req requestEncoder, res decoder) error {
+func (b *Broker) send(clientID *string, req requestEncoder, promiseResponse bool) (*responsePromise, error) {
 	b.lock.Lock()
 	b.lock.Lock()
 	defer b.lock.Unlock()
 	defer b.lock.Unlock()
 
 
 	fullRequest := request{b.correlation_id, clientID, req}
 	fullRequest := request{b.correlation_id, clientID, req}
 	buf, err := encode(&fullRequest)
 	buf, err := encode(&fullRequest)
 	if err != nil {
 	if err != nil {
-		return err
+		return nil, err
 	}
 	}
 
 
 	_, err = b.conn.Write(buf)
 	_, err = b.conn.Write(buf)
 	if err != nil {
 	if err != nil {
-		return err
+		return nil, err
 	}
 	}
 	b.correlation_id++
 	b.correlation_id++
 
 
-	if res == nil {
-		return nil
+	if !promiseResponse {
+		return nil, nil
 	}
 	}
 
 
 	promise := responsePromise{fullRequest.correlation_id, make(chan []byte), make(chan error)}
 	promise := responsePromise{fullRequest.correlation_id, make(chan []byte), make(chan error)}
 	b.responses <- promise
 	b.responses <- promise
 
 
+	return &promise, nil
+}
+
+func (b *Broker) sendAndReceive(clientID *string, req requestEncoder, res decoder) error {
+	promise, err := b.send(clientID, req, res != nil)
+
+	if err != nil {
+		return err
+	}
+
+	if promise == nil {
+		return nil
+	}
+
 	select {
 	select {
-	case buf = <-promise.packets:
+	case buf := <-promise.packets:
 		return decode(buf, res)
 		return decode(buf, res)
 	case err = <-promise.errors:
 	case err = <-promise.errors:
 		return err
 		return err