Skip to content

Commit baaf1a8

Browse files
committed
plan: add FIXME comments for topology handling and unused port parameter
1 parent 8332184 commit baaf1a8

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

connectionpool.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ func (h *hostConnPool) String() string {
272272
h.filling, h.closed, size, h.size, h.host)
273273
}
274274

275-
func newHostConnPool(session *Session, host *HostInfo, port, size int,
275+
func newHostConnPool(session *Session, host *HostInfo, port, size int, // FIXME: Remove unused port parameter
276276
keyspace string) *hostConnPool {
277277

278278
pool := &hostConnPool{

scylla.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,9 @@ outer:
395395
idx = p.shardOf(mmt)
396396
}
397397

398+
// FIXME: Add bounds check: shardOf() result may exceed len(p.conns) during topology transitions
399+
// FIXME: Prevent connection leaks when shard count decreases
400+
398401
if c := p.conns[idx]; c != nil {
399402
// We have this shard's connection
400403
// so let's give it to the caller.
@@ -462,10 +465,16 @@ func (p *scyllaConnPicker) Put(conn *Conn) error {
462465
return errors.New("server reported that it has no shards")
463466
}
464467

465-
if nrShards != len(p.conns) {
466-
if nrShards != p.nrShards {
467-
return fmt.Errorf("server %s reported that number of shard changed from %d to %d", p.address, p.nrShards, nrShards)
468+
if nrShards != p.nrShards {
469+
if gocqlDebug {
470+
p.logger.Printf("scylla: %s shard count changed from %d to %d, rebuilding connection pool",
471+
p.address, p.nrShards, nrShards)
468472
}
473+
474+
p.handleShardTopologyChange(conn, nrShards)
475+
}
476+
477+
if nrShards != len(p.conns) {
469478
conns := p.conns
470479
p.conns = make([]*Conn, nrShards, nrShards)
471480
copy(p.conns, conns)
@@ -513,6 +522,9 @@ func (p *scyllaConnPicker) Put(conn *Conn) error {
513522
return nil
514523
}
515524

525+
func (p *scyllaConnPicker) handleShardTopologyChange(newConn *Conn, newShardCount int) {
526+
}
527+
516528
func (p *scyllaConnPicker) shouldCloseExcessConns() bool {
517529
if p.nrConns >= p.nrShards {
518530
return true
@@ -626,6 +638,10 @@ func (p *scyllaConnPicker) NextShard() (shardID, nrShards int) {
626638
// to consider the next shard after the previously attempted one
627639
for i := 1; i <= p.nrShards; i++ {
628640
shardID := (p.lastAttemptedShard + i) % p.nrShards
641+
642+
// FIXME: Replace p.nrShards with len(p.conns) in loop bounds to prevent index out of bounds
643+
// FIXME: Handle topology changes where cached p.nrShards != actual len(p.conns)
644+
629645
if p.conns == nil || p.conns[shardID] == nil {
630646
p.lastAttemptedShard = shardID
631647
return shardID, p.nrShards

0 commit comments

Comments
 (0)