Skip to content

Commit 55e1d51

Browse files
committed
'Unable to discover cluster nodes with an empty rack name' issue was fixed
1 parent 34fdeeb commit 55e1d51

File tree

3 files changed

+85
-12
lines changed

3 files changed

+85
-12
lines changed

cluster_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gocql
22

33
import (
4+
"errors"
45
"net"
56
"reflect"
67
"testing"
@@ -56,3 +57,59 @@ func TestClusterConfig_translateAddressAndPort_Success(t *testing.T) {
5657
assertTrue(t, "translated address", net.ParseIP("10.10.10.10").Equal(newAddr))
5758
assertEqual(t, "translated port", 5432, newPort)
5859
}
60+
61+
func TestEmptyRack(t *testing.T) {
62+
s := &Session{}
63+
host := &HostInfo{}
64+
65+
row := make(map[string]interface{})
66+
67+
row["preferred_ip"] = "172.3.0.2"
68+
row["rpc_address"] = "172.3.0.2"
69+
row["host_id"] = UUIDFromTime(time.Now())
70+
row["data_center"] = "dc1"
71+
row["tokens"] = []string{"t1", "t2"}
72+
row["rack"] = "rack1"
73+
74+
validHost, err := s.hostInfoFromMap(row, host)
75+
if err != nil {
76+
t.Fatal(err)
77+
}
78+
if !isValidPeer(validHost) {
79+
t.Fatal(errors.New("expected valid host"))
80+
}
81+
82+
row["rack"] = ""
83+
84+
validHost, err = s.hostInfoFromMap(row, host)
85+
if err != nil {
86+
t.Fatal(err)
87+
}
88+
if !isValidPeer(validHost) {
89+
t.Fatal(errors.New("expected valid host"))
90+
}
91+
92+
strPtr := new(string)
93+
*strPtr = "rack"
94+
row["rack"] = strPtr
95+
96+
validHost, err = s.hostInfoFromMap(row, host)
97+
if err != nil {
98+
t.Fatal(err)
99+
}
100+
if !isValidPeer(validHost) {
101+
t.Fatal(errors.New("expected valid host"))
102+
}
103+
104+
strPtr = new(string)
105+
strPtr = nil
106+
row["rack"] = strPtr
107+
108+
validHost, err = s.hostInfoFromMap(row, host)
109+
if err != nil {
110+
t.Fatal(err)
111+
}
112+
if isValidPeer(validHost) {
113+
t.Fatal(errors.New("expected valid host"))
114+
}
115+
}

helpers.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -311,21 +311,27 @@ func (iter *Iter) RowData() (RowData, error) {
311311
values := make([]interface{}, 0, len(iter.Columns()))
312312

313313
for _, column := range iter.Columns() {
314-
if c, ok := column.TypeInfo.(TupleTypeInfo); !ok {
315-
val, err := column.TypeInfo.NewWithError()
316-
if err != nil {
317-
return RowData{}, err
318-
}
314+
if column.Name == "rack" && column.Keyspace == "system" && (column.Table == "peers_v2" || column.Table == "peers") {
315+
var strPtr = new(string)
319316
columns = append(columns, column.Name)
320-
values = append(values, val)
317+
values = append(values, &strPtr)
321318
} else {
322-
for i, elem := range c.Elems {
323-
columns = append(columns, TupleColumnName(column.Name, i))
324-
val, err := elem.NewWithError()
319+
if c, ok := column.TypeInfo.(TupleTypeInfo); !ok {
320+
val, err := column.TypeInfo.NewWithError()
325321
if err != nil {
326322
return RowData{}, err
327323
}
324+
columns = append(columns, column.Name)
328325
values = append(values, val)
326+
} else {
327+
for i, elem := range c.Elems {
328+
columns = append(columns, TupleColumnName(column.Name, i))
329+
val, err := elem.NewWithError()
330+
if err != nil {
331+
return RowData{}, err
332+
}
333+
values = append(values, val)
334+
}
329335
}
330336
}
331337
}

host_source.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ type HostInfo struct {
133133
state nodeState
134134
schemaVersion string
135135
tokens []string
136+
isRackNil bool
136137
}
137138

138139
func (h *HostInfo) Equal(host *HostInfo) bool {
@@ -460,9 +461,18 @@ func (s *Session) hostInfoFromMap(row map[string]interface{}, host *HostInfo) (*
460461
return nil, fmt.Errorf(assertErrorMsg, "data_center")
461462
}
462463
case "rack":
463-
host.rack, ok = value.(string)
464+
rack, ok := value.(*string)
464465
if !ok {
465-
return nil, fmt.Errorf(assertErrorMsg, "rack")
466+
host.rack, ok = value.(string)
467+
if !ok {
468+
return nil, fmt.Errorf(assertErrorMsg, "rack")
469+
}
470+
} else {
471+
if rack != nil {
472+
host.rack = *rack
473+
} else {
474+
host.isRackNil = true
475+
}
466476
}
467477
case "host_id":
468478
hostId, ok := value.(UUID)
@@ -649,7 +659,7 @@ func isValidPeer(host *HostInfo) bool {
649659
return !(len(host.RPCAddress()) == 0 ||
650660
host.hostId == "" ||
651661
host.dataCenter == "" ||
652-
host.rack == "" ||
662+
host.isRackNil ||
653663
len(host.tokens) == 0)
654664
}
655665

0 commit comments

Comments
 (0)