From 59b39ad64866c9d828c2546a75d67d83051a6978 Mon Sep 17 00:00:00 2001 From: Wen Kai Yiang Date: Tue, 19 May 2026 12:24:48 -0700 Subject: [PATCH] gcas: try all nodes in Put in case of failure --- server/gcas/gcas_impl.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/server/gcas/gcas_impl.go b/server/gcas/gcas_impl.go index 4a34b41..0be0c71 100644 --- a/server/gcas/gcas_impl.go +++ b/server/gcas/gcas_impl.go @@ -229,17 +229,21 @@ func (g *GcasImpl) Put(ctx context.Context, hash Hash, data []byte) error { return ErrNoNodes{} } - idx := rand.Intn(len(nodes)) - node := nodes[idx] - - err := node.cas.Put(ctx, hash, data) - - if err != nil { - return err + rand.Shuffle(len(nodes), func(i, j int) { + nodes[i], nodes[j] = nodes[j], nodes[i] + }) + + var lastErr error + for _, node := range nodes { + err := node.cas.Put(ctx, hash, data) + if err == nil { + _, err = g.db.ExecContext(ctx, "INSERT INTO chunks (hash, size, node_id) VALUES (?, ?, ?)", hash[:], len(data), node.id) + return err + } + lastErr = err } - _, err = g.db.ExecContext(ctx, "INSERT INTO chunks (hash, size, node_id) VALUES (?, ?, ?)", hash[:], len(data), node.id) - return err + return lastErr } var _ GCAS = (*GcasImpl)(nil)