|
@@ -159,6 +159,8 @@ func Connect(addr string, cfg ConnConfig, errorHandler ConnErrorHandler) (*Conn,
|
|
|
|
|
|
|
|
if cfg.NumStreams <= 0 || cfg.NumStreams > maxStreams {
|
|
if cfg.NumStreams <= 0 || cfg.NumStreams > maxStreams {
|
|
|
cfg.NumStreams = maxStreams
|
|
cfg.NumStreams = maxStreams
|
|
|
|
|
+ } else {
|
|
|
|
|
+ cfg.NumStreams++
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
c := &Conn{
|
|
c := &Conn{
|
|
@@ -180,7 +182,9 @@ func Connect(addr string, cfg ConnConfig, errorHandler ConnErrorHandler) (*Conn,
|
|
|
c.setKeepalive(cfg.Keepalive)
|
|
c.setKeepalive(cfg.Keepalive)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- for i := 0; i < cfg.NumStreams; i++ {
|
|
|
|
|
|
|
+ // reserve stream 0 incase cassandra returns an error on it without us sending
|
|
|
|
|
+ // a request.
|
|
|
|
|
+ for i := 1; i < cfg.NumStreams; i++ {
|
|
|
c.calls[i].resp = make(chan error)
|
|
c.calls[i].resp = make(chan error)
|
|
|
c.uniq <- i
|
|
c.uniq <- i
|
|
|
}
|
|
}
|
|
@@ -370,6 +374,25 @@ func (c *Conn) recv() error {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
return nil
|
|
return nil
|
|
|
|
|
+ } else if head.stream == 0 {
|
|
|
|
|
+ // reserved stream that we dont use, probably due to a protocol error
|
|
|
|
|
+ // or a bug in Cassandra, this should be an error, parse it and return.
|
|
|
|
|
+ framer := newFramer(c, c, c.compressor, c.version)
|
|
|
|
|
+ if err := framer.readFrame(&head); err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ frame, err := framer.parseFrame()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ switch v := frame.(type) {
|
|
|
|
|
+ case error:
|
|
|
|
|
+ return fmt.Errorf("gocql: error on stream 0: %v", v)
|
|
|
|
|
+ default:
|
|
|
|
|
+ return fmt.Errorf("gocql: received frame on stream 0: %v", frame)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
call := &c.calls[head.stream]
|
|
call := &c.calls[head.stream]
|