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)