diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 3e4e2291c7dc71bc732261e3b5644a50a6be99f4..e45bfb72b83197c933d9e3ea40dbf5f957ff3185 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -61,15 +61,25 @@ func (p *standard) HandleStream(s inet.Stream) { s.Close() } +const replicationFactor = 2 + // SendMessage sends message to each remote sequentially (randomized order), // stopping after the first successful response. If all fail, returns the last // error. func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { var err error + var numSuccesses int for _, remote := range sortedByKey(px.remoteIDs, m.GetKey()) { if err = px.sendMessage(ctx, m, remote); err != nil { // careful don't re-declare err! continue } + numSuccesses++ + switch m.GetType() { + case dhtpb.Message_ADD_PROVIDER, dhtpb.Message_PUT_VALUE: + if numSuccesses < replicationFactor { + continue + } + } return nil // success } return err // NB: returns the last error