fix(gcr/s) de-duplicate routing records
Brian Tiger Chow committed
Feb 2, 2015 at 02:44 UTC
450f21a545fdb5ac3cfcc570cc644502cf4d9491
1 file changed
+13
-4
routing/grandcentral/server.go
+13
-4
@@ -131,16 +131,25 @@ func putRoutingRecord(ds datastore.Datastore, k util.Key, value *dhtpb.Record) e
131
return nil
132
}
133
134
-func putRoutingProviders(ds datastore.Datastore, k util.Key, providers []*dhtpb.Message_Peer) error {
134
+func putRoutingProviders(ds datastore.Datastore, k util.Key, newRecords []*dhtpb.Message_Peer) error {
135
log.Event(context.Background(), "putRoutingProviders", &k)
136
pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()})
137
- old, err := getRoutingProviders(ds, k)
137
+ oldRecords, err := getRoutingProviders(ds, k)
138
if err != nil {
139
return err
140
}
141
- providers = append(providers, old...)
141
+ mergedRecords := make(map[string]*dhtpb.Message_Peer)
142
+ for _, provider := range oldRecords {
143
+ mergedRecords[provider.GetId()] = provider // add original records
144
+ }
145
+ for _, provider := range newRecords {
146
+ mergedRecords[provider.GetId()] = provider // overwrite old record if new exists
147
+ }
148
var protomsg dhtpb.Message
143
- protomsg.ProviderPeers = providers
149
+ protomsg.ProviderPeers = make([]*dhtpb.Message_Peer, 0, len(mergedRecords))
150
+ for _, provider := range mergedRecords {
151
+ protomsg.ProviderPeers = append(protomsg.ProviderPeers, provider)
152
+ }
153
data, err := proto.Marshal(&protomsg)
154
if err != nil {
155
return err