centralized_server.go 1.9 KB
Newer Older
Brian Tiger Chow's avatar
Brian Tiger Chow committed
1 2 3
package mockrouting

import (
4
	"context"
Brian Tiger Chow's avatar
Brian Tiger Chow committed
5 6
	"math/rand"
	"sync"
Brian Tiger Chow's avatar
Brian Tiger Chow committed
7
	"time"
Brian Tiger Chow's avatar
Brian Tiger Chow committed
8

tavit ohanian's avatar
tavit ohanian committed
9 10 11
	cid "gitlab.dms3.io/dms3/public/go-cid"
	ds "gitlab.dms3.io/dms3/public/go-datastore"
	dssync "gitlab.dms3.io/dms3/public/go-datastore/sync"
Raúl Kripalani's avatar
Raúl Kripalani committed
12

tavit ohanian's avatar
tavit ohanian committed
13 14
	"gitlab.dms3.io/p2p/go-p2p-core/peer"
	tnet "gitlab.dms3.io/p2p/go-p2p-testing/net"
Steven Allen's avatar
Steven Allen committed
15

tavit ohanian's avatar
tavit ohanian committed
16
	offline "gitlab.dms3.io/dms3/public/go-dms3-routing/offline"
Brian Tiger Chow's avatar
Brian Tiger Chow committed
17 18 19 20
)

// server is the mockrouting.Client's private interface to the routing server
type server interface {
Raúl Kripalani's avatar
Raúl Kripalani committed
21 22
	Announce(peer.AddrInfo, cid.Cid) error
	Providers(cid.Cid) []peer.AddrInfo
Brian Tiger Chow's avatar
Brian Tiger Chow committed
23 24 25 26 27 28

	Server
}

// s is an implementation of the private server interface
type s struct {
Brian Tiger Chow's avatar
Brian Tiger Chow committed
29
	delayConf DelayConfig
Brian Tiger Chow's avatar
Brian Tiger Chow committed
30 31

	lock      sync.RWMutex
32
	providers map[string]map[peer.ID]providerRecord
Brian Tiger Chow's avatar
Brian Tiger Chow committed
33 34
}

Brian Tiger Chow's avatar
Brian Tiger Chow committed
35
type providerRecord struct {
Raúl Kripalani's avatar
Raúl Kripalani committed
36
	Peer    peer.AddrInfo
Brian Tiger Chow's avatar
Brian Tiger Chow committed
37 38
	Created time.Time
}
Brian Tiger Chow's avatar
Brian Tiger Chow committed
39

Raúl Kripalani's avatar
Raúl Kripalani committed
40
func (rs *s) Announce(p peer.AddrInfo, c cid.Cid) error {
Brian Tiger Chow's avatar
Brian Tiger Chow committed
41 42 43
	rs.lock.Lock()
	defer rs.lock.Unlock()

44 45
	k := c.KeyString()

Brian Tiger Chow's avatar
Brian Tiger Chow committed
46 47
	_, ok := rs.providers[k]
	if !ok {
48
		rs.providers[k] = make(map[peer.ID]providerRecord)
Brian Tiger Chow's avatar
Brian Tiger Chow committed
49
	}
50
	rs.providers[k][p.ID] = providerRecord{
Brian Tiger Chow's avatar
Brian Tiger Chow committed
51 52
		Created: time.Now(),
		Peer:    p,
Brian Tiger Chow's avatar
Brian Tiger Chow committed
53 54 55 56
	}
	return nil
}

Raúl Kripalani's avatar
Raúl Kripalani committed
57
func (rs *s) Providers(c cid.Cid) []peer.AddrInfo {
Brian Tiger Chow's avatar
Brian Tiger Chow committed
58
	rs.delayConf.Query.Wait() // before locking
Brian Tiger Chow's avatar
Brian Tiger Chow committed
59 60 61

	rs.lock.RLock()
	defer rs.lock.RUnlock()
62
	k := c.KeyString()
Brian Tiger Chow's avatar
Brian Tiger Chow committed
63

Raúl Kripalani's avatar
Raúl Kripalani committed
64
	var ret []peer.AddrInfo
Brian Tiger Chow's avatar
Brian Tiger Chow committed
65
	records, ok := rs.providers[k]
Brian Tiger Chow's avatar
Brian Tiger Chow committed
66 67 68
	if !ok {
		return ret
	}
Brian Tiger Chow's avatar
Brian Tiger Chow committed
69
	for _, r := range records {
70
		if time.Since(r.Created) > rs.delayConf.ValueVisibility.Get() {
Brian Tiger Chow's avatar
Brian Tiger Chow committed
71 72
			ret = append(ret, r.Peer)
		}
Brian Tiger Chow's avatar
Brian Tiger Chow committed
73 74 75 76 77 78 79 80 81 82
	}

	for i := range ret {
		j := rand.Intn(i + 1)
		ret[i], ret[j] = ret[j], ret[i]
	}

	return ret
}

Raúl Kripalani's avatar
Raúl Kripalani committed
83
func (rs *s) Client(p tnet.Identity) Client {
Jeromy's avatar
Jeromy committed
84
	return rs.ClientWithDatastore(context.Background(), p, dssync.MutexWrap(ds.NewMapDatastore()))
Brian Tiger Chow's avatar
Brian Tiger Chow committed
85 86
}

Raúl Kripalani's avatar
Raúl Kripalani committed
87
func (rs *s) ClientWithDatastore(_ context.Context, p tnet.Identity, datastore ds.Datastore) Client {
Brian Tiger Chow's avatar
Brian Tiger Chow committed
88
	return &client{
Steven Allen's avatar
Steven Allen committed
89 90 91
		peer:   p,
		vs:     offline.NewOfflineRouter(datastore, MockValidator{}),
		server: rs,
Brian Tiger Chow's avatar
Brian Tiger Chow committed
92 93
	}
}