Skip to content

Commit ed0c71d

Browse files
author
tengu-alt
committed
Unable to discover cluster nodes with an empty rack name fix
1 parent 7b7e6af commit ed0c71d

File tree

4 files changed

+87
-12
lines changed

4 files changed

+87
-12
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212

1313
- Don't restrict server authenticator unless PasswordAuthentictor.AllowedAuthenticators is provided (CASSGO-19)
1414

15+
- Unable to discover cluster nodes with an empty rack name (CASSGO-6)
16+
1517
### Fixed
1618

1719
## [1.7.0] - 2024-09-23

cluster_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
package gocql
2626

2727
import (
28+
"errors"
2829
"net"
2930
"reflect"
3031
"testing"
@@ -80,3 +81,59 @@ func TestClusterConfig_translateAddressAndPort_Success(t *testing.T) {
8081
assertTrue(t, "translated address", net.ParseIP("10.10.10.10").Equal(newAddr))
8182
assertEqual(t, "translated port", 5432, newPort)
8283
}
84+
85+
func TestEmptyRack(t *testing.T) {
86+
s := &Session{}
87+
host := &HostInfo{}
88+
89+
row := make(map[string]interface{})
90+
91+
row["preferred_ip"] = "172.3.0.2"
92+
row["rpc_address"] = "172.3.0.2"
93+
row["host_id"] = UUIDFromTime(time.Now())
94+
row["data_center"] = "dc1"
95+
row["tokens"] = []string{"t1", "t2"}
96+
row["rack"] = "rack1"
97+
98+
validHost, err := s.hostInfoFromMap(row, host)
99+
if err != nil {
100+
t.Fatal(err)
101+
}
102+
if !isValidPeer(validHost) {
103+
t.Fatal(errors.New("expected valid host"))
104+
}
105+
106+
row["rack"] = ""
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+
116+
strPtr := new(string)
117+
*strPtr = "rack"
118+
row["rack"] = strPtr
119+
120+
validHost, err = s.hostInfoFromMap(row, host)
121+
if err != nil {
122+
t.Fatal(err)
123+
}
124+
if !isValidPeer(validHost) {
125+
t.Fatal(errors.New("expected valid host"))
126+
}
127+
128+
strPtr = new(string)
129+
strPtr = nil
130+
row["rack"] = strPtr
131+
132+
validHost, err = s.hostInfoFromMap(row, host)
133+
if err != nil {
134+
t.Fatal(err)
135+
}
136+
if isValidPeer(validHost) {
137+
t.Fatal(errors.New("expected valid host"))
138+
}
139+
}

helpers.go

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

333333
for _, column := range iter.Columns() {
334-
if c, ok := column.TypeInfo.(TupleTypeInfo); !ok {
335-
val, err := column.TypeInfo.NewWithError()
336-
if err != nil {
337-
return RowData{}, err
338-
}
334+
if column.Name == "rack" && column.Keyspace == "system" && (column.Table == "peers_v2" || column.Table == "peers") {
335+
var strPtr = new(string)
339336
columns = append(columns, column.Name)
340-
values = append(values, val)
337+
values = append(values, &strPtr)
341338
} else {
342-
for i, elem := range c.Elems {
343-
columns = append(columns, TupleColumnName(column.Name, i))
344-
val, err := elem.NewWithError()
339+
if c, ok := column.TypeInfo.(TupleTypeInfo); !ok {
340+
val, err := column.TypeInfo.NewWithError()
345341
if err != nil {
346342
return RowData{}, err
347343
}
344+
columns = append(columns, column.Name)
348345
values = append(values, val)
346+
} else {
347+
for i, elem := range c.Elems {
348+
columns = append(columns, TupleColumnName(column.Name, i))
349+
val, err := elem.NewWithError()
350+
if err != nil {
351+
return RowData{}, err
352+
}
353+
values = append(values, val)
354+
}
349355
}
350356
}
351357
}

host_source.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ type HostInfo struct {
157157
state nodeState
158158
schemaVersion string
159159
tokens []string
160+
isRackNil bool
160161
}
161162

162163
func (h *HostInfo) Equal(host *HostInfo) bool {
@@ -484,9 +485,18 @@ func (s *Session) hostInfoFromMap(row map[string]interface{}, host *HostInfo) (*
484485
return nil, fmt.Errorf(assertErrorMsg, "data_center")
485486
}
486487
case "rack":
487-
host.rack, ok = value.(string)
488+
rack, ok := value.(*string)
488489
if !ok {
489-
return nil, fmt.Errorf(assertErrorMsg, "rack")
490+
host.rack, ok = value.(string)
491+
if !ok {
492+
return nil, fmt.Errorf(assertErrorMsg, "rack")
493+
}
494+
} else {
495+
if rack != nil {
496+
host.rack = *rack
497+
} else {
498+
host.isRackNil = true
499+
}
490500
}
491501
case "host_id":
492502
hostId, ok := value.(UUID)
@@ -673,7 +683,7 @@ func isValidPeer(host *HostInfo) bool {
673683
return !(len(host.RPCAddress()) == 0 ||
674684
host.hostId == "" ||
675685
host.dataCenter == "" ||
676-
host.rack == "" ||
686+
host.isRackNil ||
677687
len(host.tokens) == 0)
678688
}
679689

0 commit comments

Comments
 (0)